前言
我们先了解下Promise规范的一些术语
术语
1.promsie 是一个有 then方法的对象或者是函数,行为遵循本规范
2.thenable 是一个有then 方法的对象或者是函数
3.vuale是 promise状态成功时的值, 也就是resolve的参数, 包括各种数据类型,也包括undefined、thenable、或者是promise
4.reason是promise状态失败时的值,也就是reject的参数,表示拒绝的原因
5.exception 是一个使用throw抛出的异常的值
Promise的状态
1.pending
- 初始的状态, 可以改变
- 一个promise 在resolve 或者reject前都处于这个状态
- 可以通过 resolve -> fulfilled状态
- 可以通过reject -> rejected状
2.fulfilled
- 最终态,可以改变
- 一个promise被resolve 后变成这个状态
- 必须要拥有一个value值
3.rejected
- 最终太,不可以改变
- 一个promsie被rejected后会变成这个状态
- 必须要拥有一个reason值
then
promise应该提供一个then方法,用来访问最终的结果,无论是value 还是reason 比如:
promise.then(onFulfilled, onRejected)
1.参数要求
- onFulfilled 必须是函数类型,如果不是函数类型,应该被忽略
- onRejected 必须是函数类型,如果不是函数,应该被忽略
2.onFulfilled 特性
- 在promsie变成fulfilled时,应该调用 onFulfilled,参数是value
- 在promise变成 fulfilled之前,不应该被调用
- 只能被调用一次
3.nRejected 特性
- 在promise变成 rejected 时,应该调用 onRejected, 参数是reason
- 在promise变成 rejected 之前, 不应该被调用.
- 只能被调用一次
4.onFulfilled 和 onRejected 应该是微任务
- 这里用queueMicrotask来实现微任务的调用 queueMicrotask()在mdn查看;
5.then方法可以被调用多次
- promise状态变成 fulfilled 后,所有的 onFulfilled 回调都需要按照then的顺序执行, 也就是按照注册顺序执行
- promise状态变成 rejected 后,所有的 onRejected 回调都需要按照then的顺序执行, 也就是按照注册顺序执行
6.返回值
then 应该返回一个promise
promise2 = promise1.then(onFulfilled, onRejected);
- onFulfilled 或 onRejected 执行的结果为x, 调用 resolvePromise
- 如果 onFulfilled 或者 onRejected 执行时抛出异常e, promise2需要被reject
- 如果 onFulfilled 不是一个函数, promise2 以promise1的value 触发fulfilled
- 如果 onRejected 不是一个函数, promise2 以promise1的reason 触发rejected
7.Promise解决程序
resolvePromise(promise2, x, resolve, reject)
- 如果promise2 和x相等的时候,那么就要返回出 reject TypeError
- 如果 x是一个promise的话
- 如果x是pending状态,那么promise必须保持pending状态,直到x被解决或拒绝
- 如果x是fulfilled状态,那么要用相同的值解决promise
- 如果x是rejected状态,用相同的原因拒绝promise
3.如果 x 是一个 object 或者 是一个 function
- let then = x.then.
- 如果检索属性x.then导致抛出了一个异常e,用e作为原因拒绝promise
- 如果 then 是一个函数,用x作为this调用它。then方法的参数为俩个回调函数,第一个参数叫做resolvePromise,第二个参数叫做rejectPromise
-
resolvePromise用一个值调用 y, 则执行 resolvePromise(promise2, y, resolve, reject);
-
rejectPromise 用一个值调用 r, 用r拒绝promise
-
如果 resolvePromise 和 rejectPromise 都调用了,那么第一个调用优先,后面的调用忽略。
-
如果调用then则抛出异常e
-
如果 resolvePromise 或 rejectPromise 已经被调用,则用e作为原因拒绝promis
-
- 如果x不是一个对象或函数,则 resolve(x)