在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循环中调用异步函数的主要内容,如果未能解决你的问题,请参考以下文章