手写promise进阶版本

 

promise/A+规范:

  术语:

  1、promise是一个对象或者函数,该对象或者函数有一个then方法

  2、thenable是一个函数或者对象,用来定义then方法

  3、value是promise成功时的状态值

  4、reason是promise失败时的状态值

    

  要求:一、二

一、

  1、三种状态 :pending | fulfilled(resolved) | rejected 

  2、rejected当处于pending状态的时候,可以转移到fulfilled(resolved)或者rejected状态 

  3、当处于fulfilled(resolved)状态或者rejected状态的时候,就不可变。  

二、

  1、一个promise必须有一个then方法,then方法接受两个参数并且必须返回一个promise

  

// onFulfilled 用来接收promise成功的值
// onRejected 用来接收promise失败的原因
promise1=promise.then(onFulfilled, onRejected);

三、

  简单的写一下promise的基本用法:

  

var promise = new Promise((resolve,reject)=>{
let a =1;b=2   
if(a<b){
resolve(a)
} else{
reject(b)
}
})
promise.then(function(value){
console.log(value)    
},function(error){
console.log(error)    
})

  接着来实现promise的过程,不多说直接贴代码

function myPromise(constructor){
    let self=this;
    self.status="pending" //定义状态改变前的初始状态
    self.value=undefined;//定义状态为resolved的时候的状态
    self.reason=undefined;//定义状态为rejected的时候的状态
    function resolve(value){
        //两个==="pending",保证了状态的改变是不可逆的
       if(self.status==="pending"){
          self.value=value;
          self.status="resolved";
       }
    }
    function reject(reason){
        //两个==="pending",保证了状态的改变是不可逆的
       if(self.status==="pending"){
          self.reason=reason;
          self.status="rejected";
       }
    }
    //捕获构造异常
    try{
       constructor(resolve,reject);
    }catch(e){
       reject(e);
    }
}

  同时,需要在myPromise的原型上定义链式调用的then方法:

myPromise.prototype.then=function(onFullfilled,onRejected){
   let self=this;
   switch(self.status){
      case "resolved":
        onFullfilled(self.value);
        break;
      case "rejected":
        onRejected(self.reason);
        break;
      default:       
   }
}

  那么我们来测试一下结果:

  

var p=new myPromise(function(resolve,reject){resolve(1)});
p.then(function(x){console.log(x)})
//输出1

 今天就写个进阶版的promise 喜欢更高难度的可以参考链接让我们共同进步吧

  

  引荐链接 :实现一个完美符合Promise/A+规范的Promise

posted on 2019-06-05 17:34  simplepoint  阅读(228)  评论(0编辑  收藏  举报