2011-10-08 30 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 
    }); 
} 

fs.lstat işlevine iletilen path değişkenine nasıl erişebilirim?Döngü için dahili senkronize işlev çağrısı

cevap

26

Bu, değerleri yinelemek için bir döngü yerine .forEach() kullanmak için mükemmel bir nedendir.

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

Yinelemeniz, kullanmak istediğiniz öğelerle özel olarak oluşturulmamışsa .forEach ile dikkatli olun. Kapatma seçeneğini genel bir kural olan IMHO olarak kullanmayı tercih ederim. –

+0

@DanibISHOP bunu genişletebilir miydin? Spesifik olarak, "elementlerle münhasıran oluşturulmamış" nedir? – sinisterstuf

11

Klasik sorun. For döngüsünün içeriğini başka bir işleve koyun ve döngüye göre adlandırın. Yolu parametre olarak geçirin.

1

Özyineleme burada güzel işler (zaman uyumlu bir şekilde icra edilmesi gereken bazı i/o var özellikle): @Aadit anlaşılacağı gibi

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

Ayrıca, bir kapatma kullanabilirsiniz

(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) 
İlgili konular