Promise
2020 javascriptPromise 对象表示异步操作的最终完成(或失败)及其结果值。
Promise 在创建的时候并不知道最终的值,这使得异步方法像同步方法一样返回值,异步方法没有立即返回最终值,而是返回一个在未来使用的 promise 值。
三个状态
Promise 有三个状态:pending(待定),fulfilled(完成),rejected(拒绝)。
- 当 pending 时,promise 可能切换到 fulfilled 或者 rejected 状态的值。
- 当 fulfilled 时,promise 无法切换到其他状态,且必须有一个不变的 value。
- 当 rejected 时,promise 无法切换到其他状态,且必须有一个不变的 reason。
实例方法
then
Promise 最重要的方式就是 then 方法,该方法注册了回调,用以接受 Promise 的最终值或 Promise 拒绝的原因。
Promise.prototype.then
方法返回一个新的 Promise 实例,并接收两个参数 onFulfilled(可选),onRejected(可选)。
p.then(onFulfilled[, onRejected]);
p.then(value => {
// fulfillment
}, reason => {
// rejection
});
catch
Promise.prototype.catch
方法返回一个新的 Promise 实例。catch 方法等同于 then 方法的 onRejected。
p.catch(onRejected);
p.catch(function (reason) {
// rejection
});
finally
Promise.prototype.finally
方法不管 Promise 状态如何都会执行,该方法的回调函数不接受任何参数。
p.finally(function () {
// settled (fulfilled or rejected)
});
静态方法
Promise.all
Promise.all([..]) 方法接受一个 Promise 对象数组作为参数。当数组内全部的 Promise 对象成功才会返回一个数组,而失败的时候则返回最先被 reject 状态的值。
Promise.all(iterable);
一个例子:
const p1 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
const p2 = Promise.resolve(3);
const p3 = 42;
const p4 = Promise.reject('bar');
Promise.all([p1, p2, p3]).then((values) => {
console.log(values);
}); // => ["foo", 3, 42]
Promise.all([p1, p2, p3, p4]).catch((reject) => {
console.log(reject);
}); // => bar
Promise.race
Promise.race([..]) 参数中的实例最先改变状态,就会立即将该实例的返回值作为 Promise.race([..]) 方法的返回值。
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then((value) => {
console.log(value); // two, 都是完成状态,但是第二个会更快
});
Promise.resolve
Promise.resolve() 将现有对象转为 Promise 对象。
如果该方法的参数为一个 Promise 对象,则直接返回;如果参数 thenable 对象(即具有 then 方法),Promise.resolve() 将该对象转为 Promise 对象并立即执行 then 方法;如果参数是一个原始值,或者是一个不具有 then 方法的对象,则 Promise.resolve 方法返回一个新的 Promise 对象,状态为 fulfilled,其参数将会作为 then 方法中 onResolved 回调函数的参数,如果 Promise.resolve 方法不带参数,会直接返回一个 fulfilled 状态的 Promise 对象。
需要注意的是,立即 resolve() 的 Promise 对象,是在本轮“事件循环”(event loop)的结束时执行,而不是在下一轮“事件循环”的开始时。
Promise.reject
Promise.reject() 同样返回一个新的 Promise 对象,状态为 rejected,无论传入任何参数都将作为 reject() 的参数
参考链接
- 《你不知道的 JavaScriopt(中卷)》
- MDN: Promise
- Promise/A+
- tc39: Promise Objects
- then/promise
- 介绍下 promise 的特性、优缺点,内部是如何实现的,动手实现 Promise #29