【问题标题】:Call asynchronous function inside for loop在for循环中调用异步函数
【发布时间】: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 变量?

【问题讨论】:

    标签: javascript node.js asynchronous for-loop scope


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2017-12-16
        • 2012-10-31
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        相关资源
        最近更新 更多