在Node.js中,我有一个函数遍历整个元素列表并进行一些数据库调用,如下所示:
for(var j=0; j<elements.length; j++)
{
//do some database calls
}
每个循环结束后(意味着当数据库调用终止时),我想“console.log(”循环终止“);”。在下面的代码中,我展示了我尝试解决此问题的方法:
for(var j=0; j<elements.length; j++)
{
(function()
{
//do some database calls
})(function(){
console.log("Loop terminated");
});
}
我使用了匿名函数,我正在尝试回调一个将打印“console.log(”Loop terminated“)”的函数。当我执行此代码时,console.log永远不会打印任何内容。我是Node.js的新手,我不太了解回调。有人可以向我解释为什么我的回调不起作用,我该如何解决?
答案 0 :(得分:6)
如果您打算并行进行数据库调用:
numCompletedCalls = 0
for(var j=0; j<elements.length; j++)
{
callDatabase(function(results) {
numCompletedCalls++;
if (numCompletedCalls == elements.length)
console.log("Done all calls!");
});
}
如果要保存所有结果,可以将其推送到allResults
数组并检查其长度,而不是递增计数器。
如果你想要顺序for循环,你需要有类似递归的模式(注意它实际上不是递归)
function iterateElements(elements, index, callback)
{
if (index == elements.length)
return callback();
// do database call with element
var ele = elements[index];
callDatabase(function(results) {
iterateElements(elements, index+1, callback);
});
}
iterateElements(elements, 0, function() {
console.log("Done all calls!");
});
大多数人倾向于使用async库,但我强烈建议至少手动尝试所有异步模式