node.js中的for循环和异步回调? [英] For-loop and async callback in node.js?
问题描述
我是JavaScript和node.js的新手.我想遍历目录并将所有文件统计信息(而不是其他目录)添加到数组中.如下所示,我的代码存在问题,因为回调可能在for循环完成后被调用,因此在回调方法中使用"i"变量将不起作用.但是代码应该如何显示,以便下面的代码段起作用?它与闭包有关吗?
I'm new to JavaScript and to node.js. I want to loop through a directory and add all file stat (not other directories) to an array. As you see below there is a problem with my code since the callback will probably get called after the for loop has finished so using the "i"-variable in the callback method will not work. But how should the code look so that the below snippet works? Does it have something to do with closures?
感谢帮助!
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
}
});
}
}
});
推荐答案
您需要使用闭包是正确的.您应该将for
循环的内容包装在一个自调用函数中,以保留每次迭代的i
值.
You are right about needing to use a closure. You should wrap the contents of the for
loop in a self-invoking function to preserve the value of i
for each iteration.
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);
}
}
});
这篇关于node.js中的for循环和异步回调?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!