2015-10-23 98 views
-2

我試圖用async遍歷異步函數數組中的圖像目錄。async.each/forEachOf在不調用回調的情況下進入下一個迭代

async.waterfall([ 
function(callback){ 
    async.forEachOf(waterfallObj.sizeDirs, function(sizeDir, index, cb){ 
     //get image files 
     fs.readdir(path.join(__dirname, sizeDir), function(err, files){ 
     tempFiles = files; 
     console.log(index); //0 1 2 3 4 
     //cb(); 
     }); 
    }); 

    callback(null); 
}, /*more functions*/ 
]); 

的想法是,我不想做下一個迭代的forEachOf循環,直到readdir完成讀取文件。據我瞭解,forEachOf不會進入其循環的下一個循環,直到它的回調被調用(就像異步waterfallseries中的每個函數一樣。但是即使cb()註釋掉了,就像我上面所說的,我仍然看到索引打印了5次。爲什麼在第一次迭代時不能停止?如果cb沒有這樣做,我如何確保readdir在下一次迭代之前完成?cb應該做什麼,如果不是這樣?(我也有同樣的效果使用async.each。我應該使用本機forEach也許吧?

+4

*「爲什麼不停止第一次迭代」*因爲它不是像'async.series'那樣工作的。這就是爲什麼有'async.forEachOfSeries'方法。 –

回答

2

這就是異步進程的重點,你不需要等待請求完成才能開始下一個請求。一旦線程空閒(並且,當然,請求已完成),它們中的每一個都會立即調用它的回調函數。

也許你正在尋找承諾的方法,你可以鏈接你的承諾,以便當一個承諾得到解決時,下一個請求將被解僱並創建一個新的承諾,其中,冗餘的,你將能夠鏈接你的第三個請求,等等。

+0

那麼回調的目的是什麼?只是在最後的回調中拋出一個錯誤,如果失敗了? – 1252748

+0

另外,async.each對於本地'for-loop'或'forEach-loop'會有什麼不同? – 1252748

+0

我注意到,當我在異步中做一個'瀑布'時,如果我得到一個數組並且我想在一些內部函數內迭代它,我必須執行'async.waterfall([ function(callback){ async.each(ARR,函數(項目,CB){ fs.readFile(項目,功能(ERR,內容){ 的console.log(內容); CB(); });} ,()的函數{); }); }]);'。如果我做了'arr.forEach',並且只在後面加了'callback()',我就得到了腳本以非預期的順序執行。爲什麼'arr.forEach'不能阻止'callback'的執行直到完成? – 1252748

相關問題