promise a+ 规范
根据我的个人理解,与实际有偏差
术语
Promise是一个拥有 then 方法的对象或函数;thenable是一个定义了 then 方法的对象或函数;value指任何 JavaScript 的合法值(包括 undefined , thenable 和 promise);exception是使用 throw 语句抛出的一个值;reason表示一个 promise 的拒绝原因。
Promise
- 共三种状态:
pending等待,fulfilled完成,rejected拒绝; - 处于
pending可转换为fulfilled或rejected; - 处于
fulfilled不可再改变,且有一个不可变的value; - 处于
rejected不可再改变,且有一个不可变的reason。
then
一个 Promise 必须提供一个 then 方法以访问当前值(value 或 reason);
then 方法接受两个可选参数,如果该参数不是函数则被忽略:
promise.then(onFulfilled, onRejected);
- onFulfilled
- 当
Promise状态为pending时不可调用; - 当
Promise状态为fulfilled被调用,其第一个参数是当前value; - 只执行一次。
- 当
- onRejected
- 当
Promise状态为pending时不可调用; - 当
Promise状态为onRejected被调用,其第一个参数是当前reason; - 只执行一次。
- 当
- 调用时机:异步执行;
- 调用要求:作为函数调用(即严格模式下
this为undefined,非严格模式下this为window); - 多次调用
- 当
Promise为fulfilled时,所有onFulfilled函数按顺序执行; - 当
Promise为rejected时,所有onRejected函数按顺序执行。
- 当
promise1.then(onFulfilled, onRejected);
promise1.then(onFulfilled, onRejected);
promise1.then(onFulfilled, onRejected);
...
-
返回:必须返回一个
Promise对象- 如果
onFulfilled或onRejected返回一个值x,则运行resolvePromise; - 如果
onFulfilled或onRejected抛出异常reason,则promise2状态为rejected,并且当前值为reason; - 如果
onFulfilled或onRejected不为函数,则promise2取promise1的状态与值;
- 如果
promise2 = promise1.then(onFulfilled, onRejected);
resolvePromise
promise2 = promise1.then(value => value);
resolvePromise(promise2, value)
主要是用来解决 value 是一个 Promise 对象的情况。
-
value和promise2是同一个对象,则抛出异常; -
如果
value是一个Promise对象value处于pending,返回的promise保持pending,直到value状态改变;- 否则用相同的状态和值执行。
-
如果
value是一个对象或函数- 把
value.then赋值给then; - 如果
then是一个函数,将value绑定为该函数this并执行,第一个参数为onFulfilled,第二个参数为onRejected;onFulfilled返回y,则继续执行resolvePromise;onRejected返回z,返回的promise以z执行拒绝;
- 如果
then是一个对象,返回的promise以value执行完成; - 以上操作抛出异常
reason,返回的promise以reason执行拒绝;
- 把
-
否则返回的
promise以value执行完成。

浙公网安备 33010602011771号