ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

PromiseA+规范(学习笔记)

2021-09-26 15:33:51  阅读:194  来源: 互联网

标签:fulfilled 调用 规范 笔记 onFulfilled PromiseA promise reject onRejected


**

了解术语:

**
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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有