实现一个promise之完成then方法

最简单的promise完成了,接着就要完善then方法:

//...

//处理返回结果

function resolvePromise(promise2, x, resolve, reject) {



};



class Promise {

//...

 //then方法,一个成功函数,一个失败函数

 then(onFulfilled, onRejected){

  //如果传进来的不是函数(不传也算),要忽略,赋值一个函数

  // 错误函数要抛出错误才能进入reject

  onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : y => y;

  onRejected = typeof onRejected === 'function' ? onRejected : r => {throw r};

  //then必需返回一个promise,因为要传递成功失败结果

  // 给下一个then,所以把方法都放入这个方法

  let promise2 = new Promise((resolve, reject) => {

   //如果成功,执行成功函数

   if(this.state === FULFILLED){

    /*成功或者失败函数返回一个值x,如果报错直接reject

     每个人写的promise不同,但是要兼容符合规范的promise

     要对x进行兼容处理,返回普通值、方法、对象,其它人的promise实例等

     这边要先使用微任务MutationObserver、process.nextTick

     如果不兼容微任务才使用宏任务setTimeout、setImmediate

     这边直接用setTimeout

    */

    setTimeout(() => {

     try{

      let x = onFulfilled(this.value);

      resolvePromise(promise2, x, resolve, reject)

     }catch (e) {

      reject(e);

     };

    }, 0);

   };

   

   //如果失败,执行失败函数

   if(this.state === REJECTED){

    setTimeout(() => {

     try{

      let x = onRejected(this.reason);

      resolvePromise(promise2, x, resolve, reject)

     }catch (e) {

      reject(e);

     };

    }, 0);

   };

   

   //如果有异步,订阅成功、失败函数

   if(this.state === PENDING){

    this.onResolvedCallbacks.push(() => {

     setTimeout(() => {

      try{

       let x = onFulfilled(this.value);

       resolvePromise(promise2, x, resolve, reject)

      }catch (e) {

       reject(e);

      };

     }, 0);

    });

    

    this.onRejectedCallbacks.push(() => {

     setTimeout(() => {

      try{

       let x = onRejected(this.reason);

       resolvePromise(promise2, x, resolve, reject)

      }catch (e) {

       reject(e);

      };

     }, 0);

    });

   };

  });

  //返回promise

  return promise2;

 }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值