假設我們希望某一組異步函數能一次進行,在不使用的任何工具的情況下,可能會編寫出類似下面的代碼:
funcs[0](function() {funcs[1](function() {funcs[2](onComplete);})
});// 注:以上代碼運行會出現的一些不方便:
// 1.回調太深,不利于閱讀..(100層嵌套...);
// 2.不能使用循環,只能一個一個手動的敲...
幸好我們還有async.series和async.waterfall。這兩個方法均接受一組函數(即任務列表)作為參數并按順序運行它們.
// async.series
var async = require('async'):
var start = new Date;async.series([function(callback) {setTimeout(callback, 100);},function(callback) {setTimeout(callback, 200);},function(callback) {setTimeout(callback, 300);}
],function(err, results){console.log('Completed in' + (new Date - start) + 'ms');
});// 注:以上函數會在運行后600毫秒之后(大于600毫秒)結束
下面再介紹一種并行運行的異步函數
// async.parallel
var async = require('async');
var start = new Date;
async.parallel([function(callback) { setTimeout(callback, 100); },function(callback) { setTimeout(callback, 300); },function(callback) { setTimeout(callback, 200); }
], function(err, results) {console.log('Completed in ' + (new Date - start) + 'ms');
});
// 注:約大于300毫秒后結束..
參考《JavaScript異步編程》— 設計快速響應的網絡應用 P76~P77