为了账号安全,请及时绑定邮箱和手机立即绑定

代码模拟 Promise 原理,请问代码中的 this.__queue 是如何作为队列工作的?

代码模拟 Promise 原理,请问代码中的 this.__queue 是如何作为队列工作的?

慕斯709654 2019-03-09 11:11:01
小弟自学编程,尚未工作,若能解我疑问,愿打赏 10 元,聊表心意。问题概况,_this.__queue.forEach(json=>{        json.fn1(...arg);这一句里面的 json 哪里来的?this.__queue.push({fn1, fn2}) 不是个对象吗?<!DOCTYPE html><html>  <head>    <meta charset="utf-8">    <title></title>    <script>    class Promise2{      constructor(fn){        const _this=this;        //重点        this.__queue=[];        this.__succ_res=null;        this.__erro_res=null;        this.status='';        fn(function (...arg){          _this.__succ_res=arg;          _this.status='succ';          _this.__queue.forEach(json=>{            json.fn1(...arg);          });        }, function (...arg){          _this.__erro_res=arg;          _this.status='error';          _this.__queue.forEach(json=>{            json.fn2(...arg);          });        });      }      then(fn1, fn2){        if(this.status=='succ'){          fn1(...this.__succ_res);        }else if(this.status=='error'){          fn2(...this.__erro_res);        }else{          this.__queue.push({fn1, fn2});        }      }    }    Promise2.all=function (arr){      let arr=[];      return Promise2(function (resolve, reject){        let i=0;        function next(){          arr[i].then(function (res){            arr.push(res);            i++;            if(i==arr.length){              resolve(arr);            }else{              next();            }          }, reject);        }      });    };    let p=new Promise2(function (resolve, reject){      setTimeout(function (){        resolve(12);      }, 500);    });    p.then(function (num){      alert(num);    }, function (){      alert('错误');    });    </script>  </head>  <body>  </body></html>
查看完整描述

4 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

第一个,MDN

this.__queue=[];

//this.__queue这不就是个数组么?

//Array.prototype.forEach()这个是遍历,自带的

语法


array.forEach(callback(currentValue, index, array){

   do something

}, this)

array.forEach(callback[, thisArg])

参数


callback

    为数组中每个元素执行的函数,该函数接收三个参数:

currentValue(当前值)

    数组中正在处理的当前元素。

index(索引)

    数组中正在处理的当前元素的索引。

array

    forEach()方法正在操作的数组。

thisArg可选

    可选参数。当执行回调 函数时用作this的值(参考对象)。

    返回值

第二个,阮一峰 es6

this.__queue.push({fn1, fn2});

//push就不用给你介绍了吧。{fn1:fn1,fn2:fn2}只是简写。

第三个,同问题二,里面的...arg也是es6


_this.__queue.forEach(json=>{

_this.__queue.forEach(function(json){


查看完整回答
反对 回复 2019-03-22
?
MYYA

TA贡献1868条经验 获得超4个赞

(json=>{

});

相当于


(function(json){

});

es6 语法 ,多看看语法基础知识


查看完整回答
反对 回复 2019-03-22
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

第一个问题:json哪来的?
得先知道foreach方法,他是遍历了_this.__queue(他是个数组),json就是里面的每一项。forEach()里面是函数,他只是用es6的箭头函数。

第二个问题:this.__queue.push({fn1, fn2}) 不是个对象吗?
this.__queue 首先是个数组,所以有push方法。push方法是把一个对象,放到放到数组变成数组的最后一项。
所以{fn1, fn2}放在这没有问题。{} 在js里就代表一个对象


查看完整回答
反对 回复 2019-03-22
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

上面的回答都对,也很直观了。全赞一遍。
感觉是题主对函数没什么概念,一直认为json是JSON对象,其实它只是个方法参数而已,改成a,b,c,.....都没关系呀。


查看完整回答
反对 回复 2019-03-22
  • 4 回答
  • 0 关注
  • 573 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信