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

¿Cómo puedo acceder a la variable path, que fue pasada a la función fs.lstat?función de llamada asincrónica en el interior de bucle

Respuesta

26

Este es un motivo perfecto para usar .forEach() en lugar de un bucle for para repetir valores.

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

Además, se puede usar como un cierre @Aadit sugiere:

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

Tenga cuidado con .forEach si su iterable no está formado exclusivamente con los elementos que desea utilizar. Preferiría utilizar la opción de cierre como regla general, en mi humilde opinión. –

+0

@DanibISHOP ¿podría ampliar eso? Específicamente, ¿qué es "no formado exclusivamente con los elementos"? – sinisterstuf

11

Problema clásico. Coloque el contenido del ciclo for en otra función y llévelo en el ciclo. Pase la ruta como un parámetro.

1

recursividad funciona muy bien aquí (especialmente si usted tiene alguna de E/S que se debe ejecutar de manera sincrónica):

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