手写promise进阶版本

Posted wuconghui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写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

以上是关于手写promise进阶版本的主要内容,如果未能解决你的问题,请参考以下文章

进阶学习8:手写Promise源码

手写Promise

手写Promise

手写Promise

手写 Promise

手写Promise