随着前端应用愈来愈复杂,异步编程已成为每个开发者必须掌握的技能之一。Promise 是 JavaScript 中解决异步编程的重要利器,但是在处理一些需要串联执行的异步任务时会变得比较繁琐。这时我们就可以使用第三方 npm 包 promise-each-concurrency
来解决这个问题。
功能
promise-each-concurrency
提供了一个 eachConcurrent
方法,可以在每个 Promise 完成后自动异步地执行下一个 Promise,直到所有 Promise 完成为止,支持并发执行 Promise 的数量控制。
安装
使用 npm 安装:
$ npm install promise-each-concurrency
使用方法
在项目中引入 promise-each-concurrency
包:
const eachConcurrent = require('promise-each-concurrency');
之后就可以使用 eachConcurrent
函数了。
基本用法
假设有一个数组,里面的每个元素都需要经过异步操作处理,当所有元素处理完成之后再进行下一步的操作。通常我们会用 Promise 的方式处理它:
-- -------------------- ---- ------- ----- ---- - --- -- --- --- ------------- - --- -------- -------------------- - ------ --- --------------- -- - ------------- -- - ------------ - --- -- ------ --- - ------------ ------------- -- - ------ --------------------- -- -------------- -- - ------------- - -------- --------------------------- -- --- -- -- -- -- --------- ---- ---- --------------- ---
以上代码使用了 Promise.all
方法,将所有的 Promise 放到一个数组中传给它,等待所有 Promise 都完成后一次性返回处理结果。但是,如果我们希望同时只能有两个异步操作进行(即每次执行两个异步操作,一个完成后再执行下一个),该怎么处理呢?
使用 promise-each-concurrency
的 eachConcurrent
方法,可以轻松解决这个问题:
-- -------------------- ---- ------- ----- -------------- - ------------------------------------ ----- ---- - --- -- --- --- ------------- - --- -------- -------------------- - ------ --- --------------- -- - ------------- -- - ------------ - --- -- ------ --- - ----- ----------- - ------------- -- - ------ -- -- --------------------- --- --------------------------- --------------- -- - ------------- - -------- --------------------------- -- --- -- -- -- -- --------- ---- ---- --------------- ---
以上代码改为使用 eachConcurrent
方法进行处理:
- 将所有需要完成的异步操作封装成一个个函数,放到数组
promiseJobs
中; - 将
promiseJobs
数组和每次执行的异步操作数量2
作为参数传给eachConcurrent
方法; - 在
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