npm 包 promise-each-concurrency 使用教程

阅读时长 5 分钟读完

随着前端应用愈来愈复杂,异步编程已成为每个开发者必须掌握的技能之一。Promise 是 JavaScript 中解决异步编程的重要利器,但是在处理一些需要串联执行的异步任务时会变得比较繁琐。这时我们就可以使用第三方 npm 包 promise-each-concurrency 来解决这个问题。

功能

promise-each-concurrency 提供了一个 eachConcurrent 方法,可以在每个 Promise 完成后自动异步地执行下一个 Promise,直到所有 Promise 完成为止,支持并发执行 Promise 的数量控制。

安装

使用 npm 安装:

使用方法

在项目中引入 promise-each-concurrency 包:

之后就可以使用 eachConcurrent 函数了。

基本用法

假设有一个数组,里面的每个元素都需要经过异步操作处理,当所有元素处理完成之后再进行下一步的操作。通常我们会用 Promise 的方式处理它:

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

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

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

以上代码使用了 Promise.all 方法,将所有的 Promise 放到一个数组中传给它,等待所有 Promise 都完成后一次性返回处理结果。但是,如果我们希望同时只能有两个异步操作进行(即每次执行两个异步操作,一个完成后再执行下一个),该怎么处理呢?

使用 promise-each-concurrencyeachConcurrent 方法,可以轻松解决这个问题:

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

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

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

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

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

以上代码改为使用 eachConcurrent 方法进行处理:

  1. 将所有需要完成的异步操作封装成一个个函数,放到数组 promiseJobs 中;
  2. promiseJobs 数组和每次执行的异步操作数量 2 作为参数传给 eachConcurrent 方法;
  3. eachConcurrent 方法的 then 回调里面处理结果。

可选参数

eachConcurrent 方法还提供了两个可选参数:

  • progressCallback(progress):在 promiseJobs 中的 Promise 完成后每隔一段时间就调用一次,回传进度信息 progress,方便展示进度条。
  • breakOnError:如果某个 Promise 失败,是否中断 Promise 队列的执行。默认为 true

例如,带有进度回传和是否中断的 eachConcurrent 示例代码:

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

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

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

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

总结

promise-each-concurrency 能够极大地方便我们在前端中异步编程时的问题,它的 eachConcurrent 方法提供了更高效的异步循环处理方式,支持可控制的并发执行数量和进度回传等功能。使用这个库会使我们的代码在可读性、可维护性上得到很好的提升,同时也能让我们更好地掌握 Promise 的使用。

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

纠错
反馈