在for循环中调用异步函数

Posted

技术标签:

【中文标题】在for循环中调用异步函数【英文标题】:Call asynchronous function inside for loop 【发布时间】:2011-12-03 13:10:18 【问题描述】:
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 函数的 path 变量?

【问题讨论】:

【参考方案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

【讨论】:

如果您的可迭代对象并非完全由您要使用的元素组成,请小心使用 .forEach。我宁愿使用关闭选项作为一般规则,恕我直言。 @DanibISHOP 你能扩展一下吗?具体来说,什么是“不完全由元素形成”?【参考方案2】:

经典问题。将 for 循环的内容放在另一个函数中,并在循环中调用它。将路径作为参数传递。

【讨论】:

【参考方案3】:

递归在这里工作得很好(特别是如果您有一些必须以同步方式执行的 i/o):

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

【讨论】:

以上是关于在for循环中调用异步函数的主要内容,如果未能解决你的问题,请参考以下文章

在 for 循环打字稿和休眠死锁中调用异步函数

在 for 循环中的异步函数调用中有条件地执行回调

在for循环打字稿和nhibernate死锁中调用异步函数

如何在异步函数中并行化 for 循环并跟踪 for 循环执行状态?

python中for循环中的异步作业[重复]

JavaScript 循环中调用异步函数的三种方法,及为什么 forEach 无法工作的分析