其他分享
首页 > 其他分享> > PromiseA+规范(学习笔记)

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.1 onFulfilled 必须是函数类型, **如果不是函数, 应该被忽略**
    1.2 onRejected 必须是函数类型, **如果不是函数,应该被忽略** 
    
  2. onFulfilled 特性

    2.1 在 promise 变成 fulfilled 之前, 不应该被调用;
    2.2 在 promise 变成 fulfilled 时,应该调用 onFulfilled, 参数时 value;
    2.3 只能被调用一次(所以在实现时需要用一个变量来限制执行次数);
    
  3. onRejected 特性

    2.1 在 promise 变成 rejected 之前, 不应该被调用;
    2.2 在 promise 变成 rejected 时,应该调用 onRejected, 参数时 reason;
    2.3 只能被调用一次(所以在实现时需要用一个变量来限制执行次数);
    
  4. onFulfilled 和 onRejected 应该是微任务

    这里水用 queueMicrotask 来实现微任务的调用。
    
  5. then 方法可以被多次调用

    5.1 promise 状态变成 fulfilled 后, 所有的 onFulfilled 回调都需要按照 then 的顺序执行;
    5.2 promise 状态变成 rejected 后, 所有的 onRejected 回调都需要按照 then 的顺序执行;
    
  6. 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;
  1. 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