【发布时间】:2014-07-23 11:19:05
【问题描述】:
以下面的代码为例,其中一个对象data 使用一些值进行初始化,然后由一些时间密集型函数处理,例如数据库访问。如果函数成功,成功的data 项目的名称将打印到控制台。否则,打印失败通知:
data = {first: 'someinfo', second: 'somemoreinfo', third: 'evenmoreinfo'};
for (var item in data) {
timeIntensiveFunction(item, data[item], function(err) {
if (!err) {
console.log(item + ' processed successfully');
} else {
console.log(item + ' failed');
}
});
}
假设函数对所有三个数据项都成功,您会希望控制台显示此内容:
first processed successfully
second processed successfully
third processed successfully
它会显示这个,假设第一次数据库访问比for循环花费更长的时间:
third processed successfully
third processed successfully
third processed successfully
这是因为控制台日志记录是在回调中完成的,只有在 for 循环完成后才合理地调用 ,因为 timeIntensiveFunction() 需要这样做长。 在调用第一个回调时,item 已经有了它的最后一个值,third。
如何将 item 的“当前”值传递给回调?
【问题讨论】:
-
JavaScript 中的对象键没有排序。考虑一个简单的有序数组,如
["first", "second", "third"]或带有对象[{id: "first"}, {id: "second"}, {id: "third"}]的数组。 -
@maček 不是我想要的。问题在于,无论排序如何,节点都会以 some 的顺序处理三个
data项目。假设timeIntensiveFunction()比for循环完成的时间更长,所有三个控制台行都将显示item的最后一个值,而不是timeIntensiveFunction()评估的值 -
@go-oleg:实际上我认为这是一个有效的副本。 For-in 与 for-loop 没有区别,并且 OP 已经认识到,在循环结束后,回调是异步调用的,每一个必要的信息都在那里。
标签: javascript node.js asynchronous callback