阅读 577

PromiseA+ 规范

术语

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

定义

Promise 表示一个异步操作的最终结果,与之进行交互的方式主要是 then 方法,该方法注册了两个回调函数,用于接收 promise 的终值或本 promise 不能执行的原因。

简单来说:Promise 是一个拥有 then 方法的对象或者函数。

状态

  1. 等待态(Pending):初始状态,可改变。
  2. 执行态(Fulfilled):最终态,不可变,必须拥有一个 value 值。
  3. 拒绝态(Rejected):最终态,不可变,必须拥有一个 reason 值。
// 状态流转:
pending --> resolve(value) --> fulfilled;
pending --> reject(reason) --> rejected;
复制代码

then

promise 必须提供一个 then 方法以访问其当前值、终值和据因

// 参数要求:必须是函数类型,如果不是,则被忽略。
// 这两个参数应该是 微任务。这里用queueMicrotask来实现微任务的调用
Promise.then(onFulfilled,onRejected);
复制代码
  1. onFulfilled 特性:

1.1 只能被调用一次
1.2 在 promise 变成 fulfilled 前不可被调用
1.3 当 promise 执行结束后必须被调用,第一个参数是 promise 的终值

  1. onRejected 特性:

2.1 只能被调用一次;
2.2 在 promise 变成 rejected 前不可被调用
2.3 当 promise 执行结束后必须被调用,第一个参数是 promise 的据因。

then 方法可以被调用多次

  1. promise状态变成 fulfilled 后,所有的 onFulfilled 回调都需要按照then的顺序执行, 也就是按照注册顺序执行(所以在实现的时候需要一个数组来存放多个onFulfilled的回调)
  2. promise状态变成 rejected 后,所有的 onRejected 回调都需要按照then的顺序执行, 也就是按照注册顺序执行(所以在实现的时候需要一个数组来存放多个onRejected的回调)

then 应该返回一个 promise

promise2 = promise1.then(onFulfilled,onRejected);
复制代码
  1. onFulfilled 或 onRejected 执行的结果为x, 调用 resolvePromise;
  2. 如果 onFulfilled 或者 onRejected 执行时抛出异常e, promise2需要被reject;
  3. 如果 onFulfilled 不是一个函数, promise2 以promise1的value 触发fulfilled;
  4. 如果 onRejected 不是一个函数, promise2 以promise1的reason 触发rejected;

resolvePromise

resolvePromise(newPromise,x,resolve,reject)
复制代码
  • 如果 promise2 和 x 相等,那么 reject TypeError;
  • 如果 x 是一个 promsie:
  1. 如果 x 是pending态,那么 promise 必须要在 pending,直到 x 变成 fulfilled or rejected;
  2. 如果 x 被 fulfilled,fulfill promise with the same value
  3. 如果 x 被 rejected,reject promise with the same reason
x.then((y) => {
    this.resolvePromise(newPromise, y, resolve, reject);
}, reject);
复制代码
  • 如果 x 是一个 object or function

let then = x.then

  1. 如果 x.then 这步出错,那么 reject promise with e as the reason
  2. 如果 then 不是一个function,那么 fulfill promise with x
  3. 如果 then 是一个函数,,then.call(x, resolvePromiseFn, rejectPromise)

3.1 resolvePromiseFn 的 入参是 y, 执行 resolvePromise(promise2, y, resolve, reject);
3.2 rejectPromise 的 入参是 r, reject promise with r;
3.3 如果 resolvePromise 和 rejectPromise 都调用了,那么第一个调用优先,后面的调用忽略;
3.4 如果调用then抛出异常e ,如果 resolvePromise 或 rejectPromise 已经被调用,那么忽略则reject promise with e as the reason

参考链接: PromiseA+规范

文章分类
前端
文章标签