当前位置: 首页 > 后端技术 > Node.js

Node.jsasync.parallelLimit和async.eachLimit的区别和不同的使用场景

时间:2023-04-03 18:33:25 Node.js

概述async.parallelLimit方法位于文档的ControllFlow章节,说明该方法用于流程控制,async.eachLimit方法位于Collections章节中,说明该方法用于数据处理。在实际开发中,我们可以使用这两种方法来完成同样的工作。我们以向26个用户发送电子邮件的任务为例。使用async.parallelLimit方法实现async.parallelLimit方法接受两个参数,第一个参数是一个任务数组,每个任务是一个函数,第二个参数是每次并行执行的任务个数,第三个参数是一个回调函数。使用async.parallelLimit完成发送邮件任务的思路是,先使用数据和要做的任务,组装成一个任务数组,交给async.parallelLimit方法执行。letuserEmailList=['a@example.com','b@example.com',...,'z@example.com'];letlimit=5;lettaskList=userEmailList.map(function(email){returnfunction(callback){sendEmail(email,function(error,result){returncallback(error,result);});}});async.parallel(taskList,limit,function(error,result){console.log(错误,结果);});使用async.eachLimit方法实现async.eachLimit方法接受四个参数,第一个参数为原始数据数组,第二个参数为每次并行处理的数据量,第三个参数为需要进行的处理对数据做的,第四个参数是回调函数。使用async.eachLimit完成发送邮件任务的思路是定义一个函数来处理数据,然后使用async.eachLimit将处理函数应用于所有数据。letuserEmailList=['a@example.com','b@example.com',...,'z@example.com'];letlimit=5;letprocessor=function(email){sendEmail(email,function(error){returncallback(error,result);});}async.eachLimit(userEmailList,limit,processor,function(error,result){console.log(error);});通过上面的代码和async文档可以看出,每一个系列函数的最终回调函数是没有运行结果的,所以需要在各个处理器中分别存储和处理结果。总结通过对比以上两种方案,不难发现async.parallelLimit和async.eachLimit的区别和应用场景。async.parallelLimit作为流程控制方法,应该应用async.parallelLimit来并发处理不同的任务并返回结果,async.eachLimit作为数据处理方法,应该并发应用来对一批数据进行相同的处理。很明显,async.eachLimit方法应该用于向26个用户发送电子邮件的任务。async.parallelLimit方法在应用场景选择得当的情况下很少使用,async.parallel就足够了。毕竟任务的数量不会很多,不限制一次性并行执行的话,问题不大。但是,如果使用不当进行数据处理,数据的量级可能会非常大。限制并行数显然不可取。由于对这两个方法的理解不够透彻,再加上受Promise.all使用方式的影响,async.eachLimit在很多历史代码中都没有出现过,笨拙地使用async.parallelLimit和map来实现功能。特此记下此文,以作备案。