var fs = require('fs'); // 要處理的文件列表 var files = ['file1', 'file2', 'file3']; function parseFile () { if (files.length == 0) { return; } var file = files.shift(); fs.readFile(file, function (err, data) { // 這裏處理文件數據 parseFile(); // 處理完畢後,經過遞歸調用處理下一個文件 }); } // 開始處理 parseFile();
關於async總結:數組
1.series(tasks, [callback]) 順序執行數組、集合內的函數,當前面一個函數執行完成就會當即執行下一個函數,若是函數觸發了錯誤,能夠在callback函數中驗證,不然會一直執行完成tasks異步
async.series({ one: function(callback) { setTimeout(function() { callback(null, 1); }, 200); }, two: function(callback) { setTimeout(function() { callback(null, 2); }, 100); } }, function(err, results) { // results is now equal to: {one: 1, two: 2} });
2.parallel(tasks, [callback]) 並行執行數組、集合內的方法,不用等到前一個函數執行完再執行下一個函數,若是函數觸發了錯誤,能夠在callback函數中驗證async
async.parallel( [ function(callback) { setTimeout(function() { callback(null, 'one'); }, 200); }, function(callback) { setTimeout(function() { callback(null, 'two'); }, 100); } ], // optional callback function(err, results) { // the results array will equal ['one','two'] even thoug // the second function had a shorter timeout } );
3.waterfall(tasks, [callback]) tasks依次運行,前一個函數的回調會做爲後一個函數的參數,若是有任何任務經過一個錯誤的回調,下一個函數不執行函數
async.waterfall([ function(callback){ callback(null, 'one', 'two'); }, function(arg1, arg2, callback){ // arg1 now equals 'one' and arg2 nowequals 'two' callback(null, 'three'); }, function(arg1, callback){ // arg1 now equals 'three' callback(null, 'done'); } ], function (err, result) { // result now equals 'done' });