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
笨拙的實現了功能,特此寫下此篇文章做爲記錄。函數