node.js中的for循环和asynchronouscallback?

我是JavaScript和node.js的新手。 我想遍历一个目录,并将所有文件统计(不是其他目录)添加到数组。 正如你在下面看到的,我的代码有一个问题,因为callback可能会在for循环完成后调用,所以在callback方法中使用“i”variables将不起作用。 但是,代码应该如何查看,以便下面的代码段工作? 它与封闭有什么关系?

感谢帮助!

fs.readdir(SYNCDIR, function(err1, files) { var filesOnly = []; if(!err1) { for(var i = 0; i < files.length; i++) { var imgFilePath = SYNCDIR + '/' + files[i]; fs.stat(imgFilePath, function(stat){ if (stat.isFile()){ filesOnly[i] = stat; // This will not be correct since the for-loop has finished } }); } } }); 

Solutions Collecting From Web of "node.js中的for循环和asynchronouscallback?"

你需要使用闭包是正确的。 你应该把for循环的内容包装在一个自我调用函数中,以保存每次迭代的i的值。

 fs.readdir(SYNCDIR, function(err1, files) { var filesOnly = []; if(!err1) { for(var i = 0; i < files.length; i++) { (function(i) { var imgFilePath = SYNCDIR + '/' + files[i]; fs.stat(imgFilePath, function(stat){ if (stat.isFile()){ filesOnly[i] = stat; } }); })(i); } } }); 

一种方法是重写循环的内部使用闭包:

 fs.readdir(SYNCDIR, function(err1, files) { var filesOnly = []; if(!err1) { for(var i = 0; i < files.length; i++) { (function(index) { var imgFilePath = SYNCDIR + '/' + files[index]; fs.stat(imgFilePath, function(stat){ if (stat.isFile()){ filesOnly[index] = stat; } }); })(i); } } }); 

一个更好看的例子,实现相同,使用Array.prototype.forEach:

 fs.readdir(SYNCDIR, function(err1, files) { var filesOnly = []; if(!err1) { files.forEach(function(file, i) { var imgFilePath = SYNCDIR + '/' + file; fs.stat(imgFilePath, function(stat){ if (stat.isFile()){ filesOnly[i] = stat; } }); }); } }); 

或者使用新的线程模块( https://github.com/robtweed/Q-Oper8 ),然后你可以更简单地使用线程subprocess中的标准同步编码来完成所有这些工作,因为它们只处理一个用户的请求一次。

告别asynchronous逻辑和嵌套callback!