PromiseA+规范(学习笔记)
作者:互联网
**
了解术语:
**
1、promise 是一个有 then 方法的对象或者函数,行为遵循本规范;
2、thenable 是一个有 then 方法的对象或者函数;
3、value 是 promise 状态成功的值, 也就是 resolve 的参数, resolve 的参数包括各种参数类型, 也包括 undefined/thenable 或者是promise;
4、reason 是 promise 状态失败的值, 也就是 reject 的参数, 表示拒绝的原因;
5、exception 是一个使用 throw 抛出的异常值;
**
了解规范
**
Promise 应该有三种状态, 注意它们之间的流转关系。
1. pending
1.1 初始状态,可改变;
1.2 一个 promise 在 resolve 或 reject 之前都处于这个状态;
1.3 通过 resolve -> fulfilled 状态;
1.4 通过 reject -> rejected 状态;
2. fulfilled
2.1 成功状态,不可改变;
2.2 一个 promise 通过 resolve 后改变成 fulfilled状态;
2.3 必须拥有一个 value 值
3. rejected
2.1 失败状态,不可改变;
2.2 一个 promise 通过 reject 后改变成 fulfilled状态;
2.3 必须拥有一个 reason ;‘
*看图更清晰*
then
Promise 应该提供一个 then 方法,用来访问最终的结果(value/reason)。
promise.then(onFulfilled, onRejected);
-
参数要求
1.1 onFulfilled 必须是函数类型, **如果不是函数, 应该被忽略** 1.2 onRejected 必须是函数类型, **如果不是函数,应该被忽略**
-
onFulfilled 特性
2.1 在 promise 变成 fulfilled 之前, 不应该被调用; 2.2 在 promise 变成 fulfilled 时,应该调用 onFulfilled, 参数时 value; 2.3 只能被调用一次(所以在实现时需要用一个变量来限制执行次数);
-
onRejected 特性
2.1 在 promise 变成 rejected 之前, 不应该被调用; 2.2 在 promise 变成 rejected 时,应该调用 onRejected, 参数时 reason; 2.3 只能被调用一次(所以在实现时需要用一个变量来限制执行次数);
-
onFulfilled 和 onRejected 应该是微任务
这里水用 queueMicrotask 来实现微任务的调用。
-
then 方法可以被多次调用
5.1 promise 状态变成 fulfilled 后, 所有的 onFulfilled 回调都需要按照 then 的顺序执行; 5.2 promise 状态变成 rejected 后, 所有的 onRejected 回调都需要按照 then 的顺序执行;
-
then 的返回值
then 应该返回一个 promise
promise2 = promise1.then(onFulffilled, onRejected);
6.1 onFulfilled 或 onRejected 执行结果为 x, 调用 resolvePromise (解析then);
6.2 如果 onFulfilled 或 onRejected 执行结果抛出异常 e,promise2需要被reject;
6.3 如果 onFulfilled 不是一个函数, promise2 以 promise1 的 value 触发 fulfilled;
6.4 如果 onRejected 不是一个函数, promise2 以 promise1 的 reason 触发 rejected;
- resolvePromise
resolvePromise(promise2, x, resolve, reject);
7.1 如果 promise2 和 x 相等, 那么 reject TypeError
7.2 如果 x 是一个promise:
如果 x 是 pending 状态, 那么 promise 必须要在 pending 状态等待, 直到 x 变成 fulfilled 或者 rejected。
如果 x 被 fulfilled, fulfill promise with the same value
如果 x 被 rejected, reject promise with the same reason
7.3 如果 x 是一个object
let then = x.then;
如果 x.then 这步出错, 那么 reject promise with e as the reason
如果 then 是一个函数, then.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 不是一个function. fulfill promise with x.
标签:fulfilled,调用,规范,笔记,onFulfilled,PromiseA,promise,reject,onRejected 来源: https://blog.csdn.net/weixin_43978501/article/details/120487824