2015-10-23 29 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

相关问题