请解释 Promise.all()、Promise.race()、Promise.allSettled() 和 Promise.any() 的作用和区别。

推荐答案

Promise.all()

  • 作用: 接收一个 Promise 可迭代对象(通常是数组),并返回一个新的 Promise。
  • 状态:
    • 如果所有输入的 Promise 都成功 fulfilled,则返回的 Promise 也成功 fulfilled,其值是按输入顺序排列的 fulfilled 值的数组。
    • 如果任何一个输入的 Promise rejected,则返回的 Promise 立即 rejected,并携带第一个 rejected 的原因。
  • 用途: 适用于需要等待所有异步操作都完成后才能继续执行的情况。

Promise.race()

  • 作用: 接收一个 Promise 可迭代对象,并返回一个新的 Promise。
  • 状态:
    • 返回的 Promise 的状态和值与第一个 settled (fulfilled 或 rejected) 的 Promise 相同。
  • 用途: 适用于只需要一个异步操作完成就继续执行的情况,例如超时处理或竞速场景。

Promise.allSettled()

  • 作用: 接收一个 Promise 可迭代对象,并返回一个新的 Promise。
  • 状态:
    • 返回的 Promise 在所有输入的 Promise 都 settled (fulfilled 或 rejected) 后才 settled。
    • 返回的 Promise 的值是一个数组,其中每个元素都描述了对应 Promise 的状态和值(如果 fulfilled)或原因(如果 rejected)。
  • 用途: 适用于需要等待所有异步操作完成,并了解所有操作结果(无论成功或失败)的情况。

Promise.any()

  • 作用: 接收一个 Promise 可迭代对象,并返回一个新的 Promise。
  • 状态:
    • 如果任何一个输入的 Promise 成功 fulfilled,则返回的 Promise 也成功 fulfilled,其值是第一个 fulfilled 的值。
    • 如果所有输入的 Promise 都 rejected,则返回的 Promise rejected,并携带 AggregateError 错误对象,其中包含所有 rejected 的原因。
  • 用途: 适用于只需要一个异步操作成功即可继续执行的情况,并且可以容忍所有失败,类似 Promise.race(),但只关心成功的结果。

本题详细解读

Promise.all() 的详细解读

Promise.all() 的核心在于**“全部成功才成功”** 的原则。它接收一个 Promise 数组,如果数组中所有 Promise 都成功完成 (fulfilled),则 Promise.all() 返回的 Promise 也会成功完成,并且结果值是一个包含所有输入 Promise 的结果值的数组,数组的顺序与输入的 Promise 顺序一致。如果数组中任意一个 Promise 失败 (rejected),则 Promise.all() 返回的 Promise 立即失败,并且失败的原因是第一个被拒绝的 Promise 的原因。

例子:

-- -------------------- ---- -------
----- -------- - -------------------
----- -------- - -------------------
----- -------- - -------------------

---------------------- --------- ----------
    ------------ -- -------------------- -- -- --- -- --
    ------------ -- ----------------------

----- -------- - -------------------
----- -------- - -------------------------
----- -------- - -------------------

---------------------- --------- ----------
    ------------ -- --------------------
    ------------ -- ---------------------- -- -- ------

Promise.race() 的详细解读

Promise.race() 的核心在于**“竞速”** 的概念。它接收一个 Promise 数组,返回一个新的 Promise,该 Promise 的状态和值由第一个 settled (fulfilled 或 rejected) 的 Promise 决定。它不关心其他 Promise 的状态,一旦有一个 Promise 完成(成功或失败),立即返回结果。

例子:

-- -------------------- ---- -------
----- -------- - --- --------------- -- ------------------- ---- -------------
----- -------- - --- --------------- -- ------------------- --- -------------

----------------------- ----------
    ----------- -- ------------------- -- -- --------
    ------------ -- ----------------------

----- -------- - --- ----------------- ------- -- ------------------ --- -----------
----- -------- - --- --------------- -- ------------------- --- -------------

----------------------- ----------
    ----------- -- -------------------
    ------------ -- ---------------------- -- -- ------

Promise.allSettled() 的详细解读

Promise.allSettled() 的核心在于**“收集所有结果”**,无论成功或失败。它接收一个 Promise 数组,返回一个新的 Promise,当所有 Promise 都 settled (fulfilled 或 rejected) 后,返回的 Promise 也会 settled。返回值是一个数组,包含每个 Promise 的状态 (status: "fulfilled" 或 "rejected") 和值 (如果 fulfilled) 或原因 (如果 rejected)。

例子:

-- -------------------- ---- -------
----- -------- - -------------------
----- -------- - -------------------------
----- -------- - --- --------------- -- ------------------- ---- ----

----------------------------- --------- ----------
    ------------- -- ----------------------
    -- ---
    -- -
    --  -------- ------------ ------ ---
    --  -------- ----------- ------- ----------
    --  -------- ------------ ------ --
    -- -

Promise.any() 的详细解读

Promise.any() 的核心在于**“只要有一个成功就好”**。 它接收一个 Promise 数组,返回一个新的 Promise,一旦数组中任何一个 Promise 成功 (fulfilled),则返回的 Promise 也会成功,并携带第一个成功 Promise 的值。如果数组中所有 Promise 都失败 (rejected),则返回的 Promise 失败,并携带一个 AggregateError 错误对象,该对象包含所有 rejected 的原因。

例子:

-- -------------------- ---- -------
----- -------- - -------------------------
----- -------- - --------------------------
----- -------- - -------------------------

---------------------- --------- ----------
  ----------- -- ------------------- -- -- ------
  ------------ -- ----------------------


----- -------- - -------------------------
----- -------- - -------------------------

---------------------- ----------
    ----------- -- -------------------
    ------------ -- -------------------- -- -- --------------- --- -------- ---- --------
纠错
反馈