前言
任何符合 promise 规范的对象或函数都可以成为 promise,promise A plus 规范地址:promisesaplus.com/
术语
- Promise:promise 是一个拥有 then 方法的对象或函数,其行为符合本规范。
- 具有 then 方法(thenable):是一个定义了 then 方法的对象或函数;
- 值(value):指任何 JavaScript 的合法值(包括 undefined,thenable 和 promise);
- 异常(exception):是使用 throw 语句抛出的一个值。
- 原因(reason):表示一个 promise 的拒绝原因。
promise 的状态
一个 Promise 的当前状态必须为以下三种状态中的一种:等待态(Pending)、已完成(Fulfilled)和已拒绝(Rejected)。
- 处于等待态时,promise 需满足以下条件:可以变为「已完成」或「已拒绝」
- 处于已完成时,promise 需满足以下条件:
- 不能迁移至其他任何状态
- 必须拥有一个不可变的值
- 处于已拒绝时,promise 需满足以下条件:
- 不能迁移至其他任何状态
- 必须拥有一个不可变的原因
必须有一个 then 方法
一个 promise 必须提供一个 then 方法以访问其当前值和原因。 promise 的 then 方法接受两个参数:promise.then(onFulfilled, onRejected) 他们都是可选参数, 同时他们都是函数,如果 onFulfilled 或 onRejected 不是函数,则需要忽略他们。
- 如果 onFulfilled 是一个函数
- 当 promise 执行结束后其必须被调用,其第一个参数为 promise 的值
- 在 promise 执行结束前其不可被调用
- 其调用次数不可超过一次
- 如果 onRejected 是一个函数
- 当 promise 被拒绝执行后其必须被调用,其第一个参数为 promise 的原因
- 在 promise 被拒绝执行前其不可被调用
- 其调用次数不可超过一次
其他规则
- 在执行上下文堆栈仅包含平台代码之前,不得调用 onFulfilled 或 onRejected
- onFulfilled 和 onRejected 必须被作为普通函数调用(即非实例化调用,这样函数内部 this 非严格模式下指向 window)
- then 方法可以被同一个 promise 调用多次
- 当 promise 成功执行时,所有 onFulfilled 需按照其注册顺序依次回调
- 当 promise 被拒绝执行时,所有的 onRejected 需按照其注册顺序依次回调
- then 方法必须返回一个 promise 对象 promise2 = promise1.then(onFulfilled, onRejected);
- 只要 onFulfilled 或者 onRejected 返回一个值 x,promise 2 都会进入 onFulfilled 状态
- 如果 onFulfilled 或者 onRejected 抛出一个异常 e,则 promise2 必须拒绝执行,并返回拒因 e
- 如果 onFulfilled 不是函数且 promise1 状态变为已完成,promise2 必须成功执行并返回相同的值
- 如果 onRejected 不是函数且 promise1 状态变为已拒绝,promise2 必须执行拒绝回调并返回相同的据因
javascript
var promise1 = new Promise((resolve, reject) => {
reject();
});
const promise2 = promise1
.then(null, function() {
return 123
});
promise2
.then(
() => {
console.log('promise2 已完成');
},
() => {
console.log('promise2 已拒绝');
}
);