自己的Promise

Posted 张啊咩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己的Promise相关的知识,希望对你有一定的参考价值。

废话不多说,直接上代码:

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);
    }
  });
};

可以说,这个自己重构的promise比官方的promise都要好,因为官方的promise居然,居然没有then的情况下,传给promise的函数还是调用了resolve和reject  (lll¬ω¬)

而这个自己写的promise,考虑好2种情况:

1.正常的异步,调用resolve和reject慢于then的使用:我们会先把then方法存进数组里面,待resolve和reject被调用

2.乱写的同步(有些大脑回路不正常的人居然用promise写同步),调用resolve和reject先于then的使用,我们会先把成功或者失败的状态和参数存好,然后待then调用的时候,再调用then传入的两个函数

以上是关于自己的Promise的主要内容,如果未能解决你的问题,请参考以下文章

前端面试题之手写promise

什么时候然后从Promise.all()的子句运行?

在javascript承诺中执行的顺序是什么

创建自己的代码片段(CodeSnippet)

自己的Promise

框架基础:ajax设计方案--- 集成promise规范,更优雅的书写代码