2011-10-08 20 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関数に渡すことができますか?ループ内で非同期関数を呼び出す

答えて

26

これは、値を反復するためにforループの代わりに.forEach()を使用するのに最適な理由です。

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に注意してください。むしろ閉鎖オプションを一般的なルールとして使用したいと思っています。 –

+0

@DanibISHOPあなたはそれを拡張できますか?具体的には、「要素と排他的に形成されていない」とは何か? – sinisterstuf

11

古典的な問題。 forループの内容を別の関数に入れ、ループ内で呼び出します。パスをパラメータとして渡します。

1

再帰はここでうまく動作(あなたが同期的に実行されなければならないいくつかのI/Oを持っている場合は特に):@Aaditが示唆よう

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

また、あなたはクロージャを使用することができ

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