JavaScript Promise 的使用
Promise 的概念
一个 Promise 必然处于以下几种状态之一:
- 待定(
pending):初始状态,既没有被兑现,也没有被拒绝。 - 已兑现(
fulfilled):意味着操作成功完成。可以用then方法来处理。 - 已拒绝(
rejected):意味着操作失败。可以用catch方法来处理
如果一个Promise已经被兑现或拒绝,即不再处于待定状态,那么则称之为已敲定(settled)。

Promise 基本使用
Promise 成功回调
1 | const promise = new Promise((resolve, reject) => { |
Promise 失败回调
1 | const promise = new Promise((resolve, reject) => { |
Promise then 方法
then 方法用于指定当 Promise 对象状态变为已兑现(fulfilled)时,所执行的操作。
1 | const promise = new Promise((resolve, reject) => { |
Promise catch 方法
catch 方法用于指定当 Promise 对象状态变为已拒绝(rejected)时,所执行的操作。
1 | const promise = new Promise((resolve, reject) => { |
Promise finally 方法
finally 方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。
1 | const promise = new Promise((resolve, reject) => { |
Promise 并发和静态方法
Promise 类提供了四个静态方法来促进异步任务的并发:
所有这些方法都接受一个 Promise(确切地说是 thenable)的可迭代对象,并返回一个新的 Promise。它们都支持子类化,这意味着它们可以在 Promise 的子类上调用,结果将是一个属于子类类型的 Promise。为此,子类的构造函数必须实现与 Promise() 构造函数相同的签名——接受一个以 resolve 和 reject 回调函数作为参数的单个 executor 函数。子类还必须有一个 resolve 静态方法,可以像 Promise.resolve() 一样调用,以将值解析为 Promise。
请注意,JavaScript 的本质上是单线程的,因此在任何时刻,只有一个任务会被执行,尽管控制权可以在不同的 Promise 之间切换,从而使 Promise 的执行看起来是并发的。在 JavaScript 中,并行执行只能通过 worker 线程实现。
Promise.all()
仅在 所有传入的 Promise 都变为 fulfilled(成功) 时才会返回结果数组。若其中任意一个 Promise 变为 rejected(失败),则立即以该失败原因拒绝。
示例:
1 | // 当所有 Promise 成功时,返回的数组 严格按传入顺序排列结果,与完成先后无关: |
Promise.allSettled()
在所有的 Promise 都被敲定时兑现。
示例:
1 | const p1 = Promise.resolve('A'); |
Promise.any()
只要传入的 Promise 列表中 有任意一个变为 fulfilled(成功),Promise.any() 就会立即 返回该成功值,并忽略其他所有 Promise 的结果(无论其他 Promise 是成功还是失败)。仅在所有传入的 Promise 都变为 rejected(失败)时,才会返回一个被拒绝的 Promise,并返回该拒绝原因。
示例:
1 | // 示例1:第一个成功值被返回 |
Promise.race()
返回的 Promise 状态由最先敲定(无论是 fulfilled 还是 rejected) 的 Promise 决定,且 立即传递其值或原因。一旦首个 Promise 敲定,其他 Promise 的结果将被完全忽略,即使后续有其他 Promise 完成。
示例:
1 | // 第一个完成的 Promise 是成功 |
Promise.resolve()
返回一个新的 Promise 对象,该对象以给定的值兑现。如果值是一个 thenable 对象(即具有 then 方法),则返回的 Promise 对象会“跟随”该 thenable 对象,采用其最终的状态;否则,返回的 Promise 对象会以该值兑现。
Promise.reject()
返回一个新的 Promise 对象,该对象以给定的原因拒绝。








