在 node.js 中正确使用 Promise.all()

阅读时长 5 分钟读完

在 node.js 中正确使用 Promise.all()

Promise.all() 是一个常用的 Promise 类方法,可以让我们在并行执行多个异步操作时,等待它们全部完成后再进行下一步操作。在前端开发中,我们常用 Promise.all() 来优化网络请求的性能,比如在请求多个接口数据时,等待全部请求结束后再统一处理数据。

但是,在 node.js 中使用 Promise.all() 时,存在一些需要注意的问题。在本文中,我将分享如何在 node.js 中正确使用 Promise.all()。

Promise.all() 的用法

Promise.all() 接收一个 promise 数组作为参数,返回一个新的 Promise 对象。传入的 promise 数组中只要有任何一个 promise 被 reject,Promise.all() 就会直接 reject,返回被 reject 的那个 promise 的错误信息。只有当传入的所有 promise 都 resolve,Promise.all() 才会 resolve,返回所有 promise 的 resolve 结果数组。

下面是 Promise.all() 的基本用法示例:

在以上示例中,我们传入了两个 resolved 状态的 promise,并使用 Promise.all() 方法来等待它们全部 resolve。当两个 promise 都 resolve 后,Promise.all() 才 resolve 并返回结果值 ['Hello', 'World']。

注意事项

在 node.js 中使用 Promise.all() 时,需要注意以下两个问题:

1. Promise.all() 中抛错的处理

Promise.all() 在遇到某个 promise reject 时,会停止执行后续的 promise,直接返回当前已完成的 promise 结果,这就有可能造成未捕获的 Promise.reject 。

解决方法是在 Promise.all() 后链式调用 catch 方法处理异常,如下所示:

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

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

当上述代码运行时,会输出 Error('Oops!'),这是由于 Promise.all() 中的第二个 promise 被 reject 了,而 Promise.all() 直接返回了该 promise 的错误信息。

2. Promise.all() 处理大量 promise 的内存问题

在 node.js 中,Promise.all() 在处理大量 promise 时,很容易导致内存溢出,因为它会一次性存储所有 promise 的结果。当我们同时处理多个大数据量的 promise 时,需要特别注意内存消耗问题。

解决方法是分批执行 Promise.all(),或使用 Promise.allSettled(),如下所示:

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

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

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

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

可以看到,在第一个 Promise.all() 中,我们同时处理了 4 个 promise,有可能会发生内存溢出。而在第二个 Promise.all() 中,我们一次只处理了 2 个 promise,可有效避免内存溢出。

另外,在第三个示例中,我们使用了 Promise.allSettled(),它和 Promise.all() 类似,但是不会因为某个 promise reject 而停止执行后续 promise,而是会依次处理所有 promise,并返回结果数组。它的结果包含每个 promise 的执行结果和状态,不会出现内存溢出的问题。

总结

在 node.js 中正确使用 Promise.all(),需要注意异常处理、分批处理和内存消耗等问题。可以通过使用 catch、分批处理或者其他替代方案,来避免这些问题,提高我们的程序性能和稳定性。

最后,总结一下正确使用 Promise.all() 的步骤:

  1. 将所有异步操作封装为 promise 实例,并存入数组中。
  2. 使用 Promise.all() 方法,等待所有 promise 全部 resolve。
  3. 处理 Promise.all() 方法返回的结果数组。
  4. 必要时处理异常,避免程序崩溃。

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

纠错
反馈