Promise 对象表示异步操作的最终完成(或失败)及其结果值。

Promise 在创建的时候并不知道最终的值,这使得异步方法像同步方法一样返回值,异步方法没有立即返回最终值,而是返回一个在未来使用的 promise 值。

三个状态

Promise 有三个状态:pending(待定),fulfilled(完成),rejected(拒绝)。

  1. 当 pending 时,promise 可能切换到 fulfilled 或者 rejected 状态的值。
  2. 当 fulfilled 时,promise 无法切换到其他状态,且必须有一个不变的 value。
  3. 当 rejected 时,promise 无法切换到其他状态,且必须有一个不变的 reason。

promise

实例方法

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() 的参数

参考链接