Подтвердить что ты не робот

Вызов асинхронной функции внутри цикла

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?

4b9b3361

Ответ 1

Это идеальная причина использовать .forEach() вместо цикла for для итерации значений.

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

Кроме того, вы можете использовать закрытие, подобное @Aadit:

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
}

Ответ 2

Классическая проблема. Поместите содержимое цикла for в другую функцию и вызовите его в цикле. Передайте путь в качестве параметра.

Ответ 3

Здесь хорошо работает рекурсия (особенно если у вас есть некоторые операции ввода/вывода, которые должны выполняться синхронно):

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