调用循环内的asynchronous函数

var path; for (var i = 0, c = paths.length; i < c; i++) { path = paths[i]; fs.lstat(path, function (error, stat) { console.log(path); // this outputs always the last element }); } 

如何访问传递给fs.lstat函数的pathvariables?

       

网上收集的解决方案 "调用循环内的asynchronous函数"

这是使用.forEach()而不是for循环迭代值的理想理由。

 paths.forEach(function( path ) { fs.lstat( path, function(err, stat) { console.log( path, stat ); }); }); 

另外,你可以像@Aadit一样使用闭包:

 for (var i = 0, c = paths.length; i < c; i++) { // creating an Immiedately Invoked Function Expression (function( path ) { fs.lstat(path, function (error, stat) { console.log(path, stat); }); })( paths[i] ); // passing paths[i] in as "path" in the closure } 

经典问题。 将for循环的内容放在另一个函数中,并在循环中调用它。 将path作为parameter passing。

recursion在这里很好地工作(特别是如果你有一些I / O必须以同步方式执行):

 (function outputFileStat(i) { var path = paths[i]; fs.lstat(path, function(err, stat) { console.log(path, stat); i++; if(i < paths.length) outputFileStat(i); }); })(0)