1.术语
1.1. 'promise' 是一个带有then 方法的对象或者函数,其行为表现遵循本规范
1.2. 'thenable' 是一个定义then方法的对象或者函数
1.3. 'value'可以是任何合法JavaScript值(包括 undefined, thenable, promise)
1.4. 'exception' 通过 throw 抛出
1.5. 'reason'表示promise被rejected的原因
2. 要求
2.1. Promise 状态
promise必须处在以下三种状态之一:pending, fulfilled, rejected
2.1.1 状态处在 pending时:
2.1.1.1. 可以变成 fulfilled 或者 rejected 状态.
2.1.2 状态处在 fulfilled 时:
2.1.2.1. 状态不可再变更
2.1.2.2. 必须有一个 value 值, 并且value值不可再变
2.1.3 状态处在 fulfilled 时:
2.1.3.1. 状态不可再变更
2.1.3.2. 必须有一个 reason 值, 并且value值不可再变
这里的 '不可再变' 意味着 引用或者值的不变(即===),但不表示 深度不变
2.2. then 方法
promise必须提供一个then方法,来访问当前或者最终的value或者reason then 接收两个参数:
promise.then(onFulfilled, onRejected)
2.2.1. then的两个参数都是可选的
2.2.1.1 onFulfilled如果不是函数,必须被忽略 // 穿透
2.2.1.2 onRejected如果不是函数,必须被忽略 // 穿透
2.2.2. onFulfilled 如果是函数:
2.2.2.1 必须在promise状态变为 fulfilled 之后被调用,将promise的 value 作为它的第一个参数
2.2.2.2 promise状态变为 fulfilled 之前不可被调用
2.2.2.3 最多被调用一次
2.2.3. onRejected 如果是函数:
2.2.3.1 必须在promise状态变为 rejected 之后被调用,将promise的 reason 作为它的第一个参数
2.2.3.2 promise状态变为 rejected 之前不可被调用
2.2.3.3 最多被调用一次
2.2.4. onFulfilled 和 onRejected 应该是微任务
2.2.5 onFulfilled 和 onRejected 必须作为函数被调用
2.2.6. 在一个promise中 可以多次调用then方法
2.2.6.1 如果promise变成了 fulfilled,所有的onFulfilled回调都需要按照then的顺序执行
2.2.6.2 如果promise变成了 rejected,所有的onRejected回调都需要按照then的顺序执行
2.2.7. then必须返回一个promise
promise2 = promise1.then(onFulfilled, onRejected);
2.2.7.1 onFulfilled 或 onRejected 执行的结果为x,调用 resolvePromise
2.2.7.2 如果 onFulfilled 或者 onRejected 执行时抛出异常e,promise2需要被reject并且将e作为reason
2.2.7.3 如果 onFulfilled 不是一个函数并且 promise1变为fulfilled,promise2 以promise1的value fulfilled
2.2.7.4 如果 onRejected 不是一个函数并且promise1变为rejected,promise2 以promise1的reason rejected
2.3. resolvePromise
resolvePromise(promise2, x, resolve, reject)
2.3.1. 如果promise2 === x, 则使用一个 TypeError 作为 reason, reject promise
2.3.2. 如果 x 是一个promise, 根据它的状态:
2.3.2.1. 如果x 在pending,promise必须保持pending直到 x变成 fulfilled 或 rejected.
2.3.2.2. 如果 x fulfilled, 使用相同的value fulfill promise
2.3.2.3. 如果 x rejected, 使用相同的reason reject promise
2.3.3. 如果 x 是一个对象或者函数:
2.3.3.1. let then = x.then;
2.3.3.2. 如果x.then 抛出错误e,使用e 作为 reason reject promise
2.3.3.3. else if then是个方法, then.call(x, resolvePromiseFn, rejectPromiseFn);
2.3.3.3.1 如果 resolvePromiseFn 的参数是 y, 执行 resolvePromise(promise2, y, resolve, reject);
2.3.3.3.2 如果rejectPromiseFn 的 参数是 r, reject promise with r.
2.3.3.3.3 如果resolvePromiseFn和rejectPromiseFn 都调用了,那么第一个调用优先,后面的调用忽略。
2.3.3.3.4 如果调用then抛出异常e
2.3.3.3.4.1 如果 resolvePromiseFn 或 rejectPromiseFn 已经被调用,那么忽略
2.3.3.3.4.3 否则,reject promise with e as the reason
2.3.3.4 如果 then 不是一个function. fulfill promise with x.
原文链接:promisesaplus.com/