首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >实现一个promise之完成then方法

实现一个promise之完成then方法

作者头像
wade
发布2020-04-24 13:04:59
发布2020-04-24 13:04:59
5400
举报
文章被收录于专栏:coding个人笔记coding个人笔记

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

代码语言:javascript
复制
//...
//处理返回结果
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;
 }
}

(完)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 coding个人笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档