博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【笔记】实现一个简易的Promise
阅读量:4952 次
发布时间:2019-06-11

本文共 1883 字,大约阅读时间需要 6 分钟。

const PENDING_STATE = "pending";const FULLFILL_STATE = "fullfilled";const REJECTED_STATE = "refected";class Promise {  constructor(executor) {    if (typeof executor !== "function") {      throw new Error("Promise executor must be a function.");    }    this.__state = PENDING_STATE;    this.__chains = [];    const resolve = res => {      // 当且仅当状态是 pending 状态时才可以调用resolve或者reject,防止二次调用。      if (this.__state !== PENDING_STATE) return;      // resolve要处理promise,判断是否有then属性      if (res && typeof res.then === "function") {        return res.then();      }      this.__state = FULLFILL_STATE;      this.__internalValue = res;      for (const { onFullFilled } of this.__chains) {        onFullFilled(res);      }    };    const reject = err => {      if (this.__state !== PENDING_STATE) return;      this.__state = REJECTED_STATE;      this.__internalValue = err;      for (const { onRejected } of this.__chains) {        onRejected(err);      }    };    // 规范中,Promise初始化就调用executor    try {      executor(resolve, reject);    } catch (err) {      // 如果处理器函数抛出一个同步错误,我们认为这是一个失败状态      reject(err);    }  }  then(onFullFilled, onRejected) {    return new Promise((resolve, reject) => {      // 参考上述的constructor实现      const _onFullFilled = res => {        try {          resolve(onFullFilled(res));        } catch (err) {          reject(err);        }      };      const _onRejected = err => {        try {          reject(onRejected(res));        } catch (err) {          reject(err);        }      };      if (this.__state === FULLFILL_STATE) {        _onFullFilled(this.__internalValue);      } else if (this.__state === REJECTED_STATE) {        _onRejected(this.__internalValue);      } else {        this.__chains.push({          onFullFilled: _onFullFilled,          onRejected: _onRejected        });      }    });  }}

 

转载于:https://www.cnblogs.com/smileSmith/p/8920234.html

你可能感兴趣的文章
js中tagName和nodeName
查看>>
PC-XP系统忘记密码怎么办
查看>>
Android实例-打电话、发短信和邮件,取得手机IMEI号(XE8+小米2)
查看>>
深入了解Oracle ASM(二):ASM File number 1 文件目录
查看>>
SQL数据库学习系列之一
查看>>
Boosting(提升方法)之AdaBoost
查看>>
CUDA学习1 在Visual Studio和CodeBlocks上配置
查看>>
JavaScript(6)——事件1.0
查看>>
2013 ACM-ICPC China Nanjing Invitational Programming Contest 总结
查看>>
【Hibernate学习笔记-5】@Formula注解的使用
查看>>
链接元素<a>
查看>>
Binding object to winForm controller through VS2010 Designer(通过VS2010设计器将对象绑定到winForm控件上)...
查看>>
Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)
查看>>
前端性能优化集【持续更新】
查看>>
第二章:webdriver 控制浏览器窗口大小
查看>>
四则运算2初步构思
查看>>
Break the Chocolate(规律)
查看>>
C#jbox小节
查看>>
结构体指针释放的问题
查看>>
C#枚举Enum[轉]
查看>>