实现一个 Promise.all

推荐答案

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

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

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

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

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

本题详细解读

1. 函数定义

myPromiseAll 是一个自定义的 Promise.all 实现,它接受一个包含多个 Promise 对象的数组 promises 作为参数。

2. 参数校验

首先,函数会检查传入的参数是否是一个数组。如果不是数组,则立即返回一个被拒绝的 Promise,并抛出一个 TypeError

3. 结果数组和计数器

函数内部定义了一个空数组 results 用于存储每个 Promise 的结果,以及一个计数器 completedPromises 用于跟踪已经完成的 Promise 数量。

4. 空数组处理

如果传入的 promises 数组为空,则立即返回一个已解决的 Promise,并将空数组 results 作为结果。

5. 遍历 Promise 数组

函数遍历 promises 数组中的每个 Promise,并使用 Promise.resolve 将其转换为 Promise 对象(以防传入的不是 Promise)。然后,通过 .then 方法处理每个 Promise 的结果。

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

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

6. 结果存储与完成判断

每当一个 Promise 完成时,将其结果存储在 results 数组的对应位置,并增加 completedPromises 计数。当所有 Promise 都完成时,调用 resolve 方法返回 results 数组。

7. 错误处理

如果任何一个 Promise 被拒绝,则立即调用 reject 方法,并将错误传递给调用者。

8. 总结

这个实现的核心思想是通过遍历 Promise 数组,逐个处理每个 Promise 的结果,并在所有 Promise 完成后返回结果数组。如果任何一个 Promise 失败,则立即返回错误。

纠错
反馈