2011-10-08 224 views
13
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 
    }); 
} 

如何訪問path變量,該變量已傳遞給fs.lstat函數?調用異步函數for循環

回答

26

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

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 
} 
+0

要小心.forEach,如果你的iterable不是專門用你想要使用的元素組成的。作爲一般規則,我寧願使用閉包選項,恕我直言。 –

+0

@DanibISHOP你可以擴展嗎?具體而言,「不完全由元素組成」是什麼? – sinisterstuf

11

經典問題。將for循環的內容放在另一個函數中,並在循環中調用它。將路徑作爲參數傳遞。

1

遞歸很好地工作在這裏(特別是如果你有一些I/O必須以同步的方式執行):

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

此外,您可以像@Aadit建議使用閉包

(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)