async.parallelLimit
方法在文档中位于 Controll Flow
章节,代表这个方法是用来作流程控制的,async.eachLimit
方法位于 Collections
章节,代表这个方法是用来作数据处理的。在实际开发中咱们可使用这两个方法来完成一样的工做,下面咱们就以给 26 位用户发送邮件这个任务来举例。html
async.parallelLimit
方法接受两个参数,第一个参数为任务数组,每一个任务是一个函数,第二个参数为每次并行执行的任务数,第三个参数为回调函数。使用 async.parallelLimit
完成发送邮件任务的思路是先使用数据与所要作的任务,组装成任务数组交给 async.parallelLimit
方法去执行。git
let userEmailList = [ 'a@example.com', 'b@example.com', ..., 'z@example.com' ]; let limit = 5; let taskList = userEmailList.map(function (email) { return function (callback) { sendEmail(email, function (error, result) { return callback(error, result); }); } }); async.parallel(taskList, limit, function (error, result) { console.log(error, result); });
async.eachLimit
方法接受四个参数,第一个参数为原始数据数组,第二个参数为每次并行处理的数据量,第三个参数为须要为数据进行的处理,第四个参数为回调函数。使用 async.eachLimit
完成发送邮件任务的思路是定义一个对数据进行处理的函数,而后使用 async.eachLimit
将处理函数应用全部数据上。github
let userEmailList = [ 'a@example.com', 'b@example.com', ..., 'z@example.com' ]; let limit = 5; let processer = function (email) { sendEmail(email, function (error) { return callback(error, result); }); } async.eachLimit(userEmailList, limit, processer, function (error, result){ console.log(error); });
经过以上代码和 async 文档 能够看出 each
系列函数最终的回调函数是没有运行结果的,因此每一次 processor
中的结果须要另行存储处理。数组
经过对比以上两种方案,很容易发现 async.parallelLimit
与 async.eachLimit
的区别与应用场景,async.parallelLimit
做为流程控制方法,应该应用于并发处理不一样的任务并返回结果,async.eachLimit
做为数据处理方法,应该应用于并发地对一批数据进行相同的处理。因此显然对于给 26 为用户发送邮件这个任务应该使用 async.eachLimit
方法来实现。并发
在应用场景选择恰当的状况下不多使用到 async.parallelLimit
方法,使用 async.parallel
就能够了,毕竟任务数量不会很是巨大,不作限制一次性并行执行也不会有太大问题。可是若是使用不当,用做数据处理,数据的量级可能会很是巨大,若是不作并行数量限制显然是不可取的方式。async
由于对于这两个方法理解地不够透彻,而且受到 Promise.all
使用方式的影响,不少历史代码中从未出现过 async.eachLimit
,都是使用 async.parallelLimit
配合 map
笨拙的实现了功能,特此写下此篇文章做为记录。函数