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

小弟自学编程,尚未工作,若能解我疑问,愿打赏 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>


慕斯709654
浏览 574回答 4
4回答

潇潇雨雨

第一个,MDNthis.__queue=[];//this.__queue这不就是个数组么?//Array.prototype.forEach()这个是遍历,自带的语法array.forEach(callback(currentValue, index, array){&nbsp; &nbsp;do something}, this)array.forEach(callback[, thisArg])参数callback&nbsp; &nbsp; 为数组中每个元素执行的函数,该函数接收三个参数:currentValue(当前值)&nbsp; &nbsp; 数组中正在处理的当前元素。index(索引)&nbsp; &nbsp; 数组中正在处理的当前元素的索引。array&nbsp; &nbsp; forEach()方法正在操作的数组。thisArg可选&nbsp; &nbsp; 可选参数。当执行回调 函数时用作this的值(参考对象)。&nbsp; &nbsp; 返回值第二个,阮一峰 es6this.__queue.push({fn1, fn2});//push就不用给你介绍了吧。{fn1:fn1,fn2:fn2}只是简写。第三个,同问题二,里面的...arg也是es6_this.__queue.forEach(json=>{_this.__queue.forEach(function(json){

MYYA

(json=>{});相当于(function(json){});es6 语法 ,多看看语法基础知识

眼眸繁星

第一个问题:json哪来的?得先知道foreach方法,他是遍历了_this.__queue(他是个数组),json就是里面的每一项。forEach()里面是函数,他只是用es6的箭头函数。第二个问题:this.__queue.push({fn1, fn2}) 不是个对象吗?this.__queue 首先是个数组,所以有push方法。push方法是把一个对象,放到放到数组变成数组的最后一项。所以{fn1, fn2}放在这没有问题。{} 在js里就代表一个对象

慕桂英546537

上面的回答都对,也很直观了。全赞一遍。感觉是题主对函数没什么概念,一直认为json是JSON对象,其实它只是个方法参数而已,改成a,b,c,.....都没关系呀。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript