共计 2111 个字符,预计需要花费 6 分钟才能阅读完成。
PromiseA+ 标准
术语
- promise 是一个有 then 办法的对象或者函数,行为遵循 PromiseA+ 标准
- thenable 是一个有 then 办法的对象或者函数
- value 是 Promise 状态胜利时的值,也是 resolve 的参数,包含各种数据类型,undefined / string / number / boolean / promise …
- reason 是 Promise 状态失败时的值,也就是 reject 的参数,示意回绝的起因
- exception throw 抛出去的异样
标准
Promise States
promise 有三种状态,要留神他们之间的关系
- pending
1.1 初始状态,能够扭转
1.2 一个 promise 在被 resolve 或者 reject 之前,都处于这个状态
1.3 通过 resolve -> fulfilled
1.4 通过 reject -> rejected - fulfilled
2.1 最终态,不能够扭转
2.2 一个 promise 在被 resolve 之后变成这个状态
2.3 必须有一个 value 值 // undefined - rejected
3.1 最终态,不能够扭转
3.2 一个 promise 在被 reject 之后变成这个状态
2.3 必须有一个 reason 值 // undefined
pending -> resolve(value) -> fulfilled
pending -> reject(reason) -> rejected
then
promise 应该提出一个 then 办法,用来拜访最终的后果,无论是 value 还是 reason。
promsie.resolve(onfulfilled, onrejected);
- 参数要求
1.1 onfulfilled 必须是函数类型,如果不是函数,应该被疏忽
1.2 onrejected 必须是函数类型,如果不是函数,应该被疏忽 - onfulfilled 个性
2.1 在 promise 变成 fulfilled 后,应该调用 onfulfilled,参数是 value
2.2 在 promise 变成 fulfilled 前,不应该被调用
2.3 只能被执行一次 - onrejected 个性
3.1 在 promise 变成 rejected 后,应该调用 onrejected,参数是 reason
3.2 在 promise 变成 rejected 前,不应该被调用
3.3 只能被执行一次 - onfulfilled 和 onrejected 应该是微工作
queueMicrotask 实现微工作的调用 -
then 办法能够被调用屡次
5.1 promise 变成 fulfilled 后,所有 onfulfilled 回调都应该依照 then 的程序执行在实现 promsie 的时候,咱们须要一个数组来存储 onfulfilled 的 cb
promise.then(cb1).then(cb2).then(cb3)... // or const promise = new Promsie(); promise.then(cb1); promise.then(cb2); //
5.2 promise 变成 rejected 后,所有 onrejected 回调都应该依照 then 的程序执行
在实现 promsie 的时候,咱们须要一个数组来存储 onrejected 的 cb
-
返回值
then 的返回值是一个 promise,新的?旧的?promsie2 = promise1.then(onfulfilled, onrejected)
6.1 onfulfilled 和 onrejected 执行的后果为 x,调用 resolvePromise
6.2 onfulfilled 和 onrejected 执行的异样,promsie2 须要被 rejected
6.3 如果 onfulfilled 不是一个函数,promsie2 以 promise1 的 value 触发 fulfilled
6.4 如果 onrejected 不是一个函数,promsie2 以 promise1 的 reason 触发 rejected -
resolvePromise
resolvePromsie(promise2, x, resolve, reject);
7.1 如果 promise2 和 x 相等,那么 reject typeError 会死造成死循环, 为什么???
7.2 如果 x 是 promise如果 x 是 pending,promise 的状态必须也是期待 /pending,晓得 x 变成了 fulfilled / rejected 如果 x 是 fulfilled,fulfilled promise width the same value 值的透传 如果 x 是 rejected,reject promise width the same reason
7.3 如果 x 是一个 object 或者是一个 function
let then = x.then; 如果 x.then 这一步出错了,try catch(e), reject(e) ** 如果是一个 object 怎么可能会出错???** 如果 then 是一个函数,then.call(x, resolvePromsieFn, rejectedPromiseFn); resolvePromsieFn 入参 y,执行 resolvePromsie(promise2, y, resolve, reject); 如果调用 then 的时候抛出了异样 e,reject reason
正文完
发表至: javascript
2021-09-18