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

Jak uzyskać dostęp do zmiennej path, która została przekazana do funkcji fs.lstat?Wywołanie funkcji asynchronicznej wewnątrz pętli

Odpowiedz

26

Jest to doskonały powód, aby używać .forEach() zamiast pętli for do iterowania wartości.

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

Ponadto, można użyć zamknięcie jak @Aadit proponuje:

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

Uważaj z .forEach, jeśli twoja iteracja nie jest wyłącznie utworzona z elementów, których chcesz użyć. Wolałbym raczej użyć opcji zamknięcia, co do zasady, IMHO. –

+0

@ DanibISHOP możesz rozwinąć? W szczególności, co "nie jest wyłącznie uformowane z żywiołami"? – sinisterstuf

11

Klasyczny problem. Umieść zawartość pętli for w innej funkcji i wywołaj ją w pętli. Przekaż ścieżkę jako parametr.

1

Recursion działa ładnie tutaj (zwłaszcza jeśli masz jakieś I/O, które muszą być wykonywane w sposób synchroniczny):

(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) 
Powiązane problemy