目录
术语
- promise 是一个有then 方法的对象或者函数,行为遵循本规范
- thenable 是一个有then 方法的对象或者函数
- value 是promise 状态成功时的值,也就是resolve的参数,包括各种数据类型,也包括undefined / thenable或者是promise
- reason 是promise 状态失败时的值,也就是reject的参数,表示拒绝的原因
- exception 是一个使用throw 抛出的异常值
Promise States
Promise应该有三种状态,要注意他们之间的流转关系
- pending
- 初识的状态,可改变
- 一个promise 在resolve 或者reject 前都处于这个状态
- 可以通过 resolve => fulfilled 状态
- 可以通过 rehect => rejected 状态
- fulfilled
- 最终态,不可变
- 一个promise 被resolve 后会变成这个状态
- 必须拥有一个value 值
- rejected
- 最终态,不可变
- 一个promise 被reject 后会变成这个状态
- 必须拥有一个reason
总结:promise的状态流转是这样的
- pending => resolve(value) => fulfilled
- pending => reject(reason) => rejected
then
Promise 应该提供一个then 方法,用来访问最终的结果,无论是value 还是reason
promise.then(onFulfilled, onRejected);
- 参数要求
- onFulfilled 必须是函数类型,如果不是函数,应该被忽略
- onRejected 必须是函数类型,如果不是函数,应该被忽略
- onFulfilled 特性
- 在promise 变成fulfilled 时,应该调用onFulfilled,参数是value
- 在promise 变成fulfilled之前,不应该被调用
- 只能被调用一次(所以在实现的时候需要一个变量来限制执行次数)
- onRejected 特性
- 在promise 变成rejected 时,应该调用onRejected,参数是reason
- 在promise 变成rejected 之前,不应该被调用
- 只能被调用一次(所以在实现的时候需要一个变量来限制执行次数)
- onFulfilled 和 onRejected 应该是微任务
- 这里用queueMicrotask来实现微任务的调用
queueMicrotask(() => { // 实现微任务调用 })
- 这里用queueMicrotask来实现微任务的调用
-
then 方法可以被调用多次
-
promise 变成fulfilled / rejected 后,所有的onFulfilled / onRejected 回调都需要按照then 的顺序执行,也就是按照注册顺序执行(所以在实现的时候需要一个数组来存放多个onFulfilled / onRejected 的回调)
-
-
返回值
then 应该返回一个promisepromise2 = promise1.then(onFulfilled, onRejected);
-
onFulfilled 或 onRejected 执行结果为x,调用 resolvePromise(下面细讲一下 resolvePromise 是什么东西)
-
如果onFulfilled 或者 onRejected 执行时抛出异常e,promise2需要被reject
-
如果onFulfilled 不是一个函数,promise2 以promise1 的 value 触发fulfilled
-
如果onRejected 不是一个函数,promise2 以promise1的reason 触发rejetced
-
- resolvePromise
resolvePromise(promise2, x, resolve, reject);
- 如果promise2 和 x 相等,那么reject TypeError
- 如果 x 是一个 promise
- 如果x 是pending,那么promise必须要在pending,直到x 变成fulfilled or rejected.
- 如果x 被fulfilled,fulfill promise with the same value.
- 如果x 被 rejected,reject promise with the same reason.
- 如果x 是一个 object 或者是一个 funciton
let then = x.then;
-
如果x.then 这步出错,那么 reject promise with e as then reason.
-
如果then是一个函数
the.call(x, resolvePromiseFn, rejectPromise);
resolvePromiseFn的入参是y,执行
resolvePromise(promise2, y, resolve, reject);
rejectPromise 的入参是 r, reject promise with r.
-
如果resolvePromise 和rejectPromise都调用了,那么第一个调用优先,后面的调用忽略。
-
如果调用then抛出异常e
如果resolvePromise 或 rejectPromise 已经被调用,那么忽略
则,reject promise with e as the reason -
如果then 不是一个funciton.fulfill promise with x.
-