1、Promise术语

在实现Promise之前,我们先来了解一下Promise中的常用术语:

  1. promise 是一个有then方法的对象或者是函数,行为遵循本规范;
  2. thenable 是一个有then方法的对象或者是函数;
  3. value 是promise状态成功时的值,也就是resolve的参数, 包括各种数据类型, 也包括undefined/thenable或者是 promise;
  4. reason 是promise状态失败时的值, 也就是reject的参数, 表示拒绝的原因;
  5. exception 是一个使用throw抛出的异常值;

2、Promise状态规范

2.1 Promise实例状态

Promise 实例有三种状态:

  • 等待中(pending)
  • 完成了 (fulfilled)
  • 拒绝了(rejected)

2.2 状态解析

  • pending
    • 初始的状态, 可改变.
    • 一个promise在resolve或者reject前都处于这个状态。
    • 可以通过 resolve -> fulfilled 状态;
    • 可以通过 reject -> rejected 状态;
  • fulfilled
    • 是最终态, 不可变.
    • 一个promise被resolve后会变成这个状态.
    • 必须拥有一个value值
  • rejected
    • 最终态, 不可变.
    • 一个promise被reject后会变成这个状态
    • 必须拥有一个reason

2.3 状态转换

一旦从等待状态变成为其他状态就永远不能更改状态了,也就是说一旦状态变为 resolved 后,就不能再次改变。

pending -> resolve(value) fulfilled

pending -> reject(reason) rejected

3、一步步实现Promise

一个 Promise 应该具备的最基本的特征,至少有以下几点:

  • 可以接收一个 executor 作为入参
  • 具备 pending、resolved 和 rejected 这三种状态
  1. 我们将自己的写的Promise命名为MyPromise
  1. class MyPromise {
  2. constructor() {
  3. }
  4. }
  1. 定义三种状态
  1. const PENDING = 'pending';
  2. const FULFILLED = 'fulfilled';
  3. const REJECTED = 'rejected';
  1. 设置初始化状态
  1. class MyPromise {
  2. constructor() {
  3. // 初始状态为pending
  4. this.status = PENDING;
  5. this.value = null;
  6. this.reason = null;
  7. }
  8. }
  1. 编写resolve方法

根据规范resolve方法要更改status,从pending改变为fulfilled

  1. resolve(value) {
  2. if (this.status === PENDING) {
  3. this.status = FULFILLED;
  4. this.value = value;
  5. }
  6. }
  1. 编写reject方法

根据规范reject方法也要更改status,从pending改变为reject

  1. reject(reason) {
  2. if (this.status === PENDING) {
  3. this.status = REJECTED;
  4. this.reason = reason;
  5. }
  6. }
  1. 加入参数

实际开发中我们使用Promise是这样的:

  1. new Promise(( resolve, reject ) => {
  2. // todo
  3. })

我们需要加入入参:

  • 入参是一个函数, 函数接收resolve和reject两个参数.
  • 注意在初始化promise的时候, 就要执行这个函数, 并且有任何报错都要通过reject抛出去
  1. class MyPromise {
  2. constructor(execute) {
  3. // 初始状态为pending
  4. this.status = PENDING;
  5. this.value = null;
  6. this.reason = null;
  7. try {
  8. execute(this.resolve.bind(this), this.reject.bind(this));
  9. } catch (e) {
  10. this.reject(e);
  11. }
  12. }
  13. resolve(value) {
  14. if (this.status === PENDING) {
  15. this.status = FULFILLED;
  16. this.value = value;
  17. }
  18. }
  19. reject(reason) {
  20. if (this.status === PENDING) {
  21. this.status = REJECTED;
  22. this.reason = reason;
  23. }
  24. }
  25. }

4、总结

本节我们通过阅读Promise A+规范实现了Promise的构造函数以及状态转换,下一节我们将实现then方法;

5、参考链接

Promise A+规范: https://promisesaplus.com/