ES10 中实现 Promise.all() 方法的手写示例

阅读时长 4 分钟读完

简介

Promise.all() 方法在前端开发中是非常常见的一种异步编程解决方案。它实现了在一组 Promise 执行完毕后再进行下一步操作的功能,极大地方便了我们在业务逻辑代码中的编写。

在 ES10 中,JavaScript 引入了 Promise.allSettled() 方法,它与 Promise.all() 方法功能相似,但是会等待所有的 Promise 都执行完成,不管是否 resolve 或 reject。但 Promise.allSettled() 方法在我们经常处理的场景中并不常用,因此本文重点分享如何手写 Promise.all() 方法,帮助我们更好地理解 Promise,以及优化我们的异步编程体验。

Promise.all() 方法

Promise.all() 方法接收一个 Promise 数组,然后等待所有 Promise 都 resolve 后返回一个包含所有执行结果的 Promise(reject 第一个 rejected Promise 的结果)。示例代码如下:

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

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

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

分析

上述代码通过 Promise.all() 方法包装了传入的 Promise 数组,创建了一个新的 Promise 实例返回。Promise.all() 中的核心逻辑是通过一个计数器来计算 resolve 或 reject 的 Promise 数量,如果等于传递的 Promise 数组的长度,则执行 resolve 或 reject。

基于该逻辑,我们可以进一步拆解代码中的 promiseAll() 方法。

首先,我们创建一个新的 Promise 对象,然后使用 forEach() 方法循环遍历传入的 Promise 数组,对每个 Promise 进行 resolve 和 reject 的处理。

处理 resolve 时,将返回的结果存储在一个结果数组中,同时将计数器加一,当计数器等于传递的 Promise 数量时,执行 resolve 方法。

处理 reject 时,直接执行 reject 方法。

最后,我们将整个方法封装到 try-catch 块中,并添加必要的异常检查,确保代码实现的完整性和鲁棒性。

总结

通过手写 Promise.all() 方法的实现,我们加深了对 Promise 的理解,同时掌握了重要的异步编程实践中的核心逻辑。希望本篇文章的内容能够与读者分享更多的技术细节和思路,帮助大家在实际开发中遇到 Promise 相关问题时能够更加游刃有余。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c8bad85ad90b6d041484c2

纠错
反馈