Fra*_*nXh 1 asynchronous callback node.js
在Node.js中,我有一个函数遍历整个元素列表并执行一些数据库调用,如下所示:
for(var j=0; j<elements.length; j++)
{
//do some database calls
}
Run Code Online (Sandbox Code Playgroud)
每个循环结束后(意味着当数据库调用终止时),我想"console.log("循环终止");".在下面的代码中,我展示了我尝试解决此问题:
for(var j=0; j<elements.length; j++)
{
(function()
{
//do some database calls
})(function(){
console.log("Loop terminated");
});
}
Run Code Online (Sandbox Code Playgroud)
我使用匿名函数,我试图回调一个将打印"console.log("循环终止")"的函数.当我执行此代码时,console.log永远不会打印任何内容.我是Node.js的新手,我不太了解回调.有人可以向我解释为什么我的回调不起作用,我该如何解决?
如果您打算并行进行数据库调用:
numCompletedCalls = 0
for(var j=0; j<elements.length; j++)
{
callDatabase(function(results) {
numCompletedCalls++;
if (numCompletedCalls == elements.length)
console.log("Done all calls!");
});
}
Run Code Online (Sandbox Code Playgroud)
如果你要保存所有结果,你可以推送到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!");
});
Run Code Online (Sandbox Code Playgroud)
大多数人倾向于使用异步库,但我强烈建议至少手动尝试所有异步模式
| 归档时间: |
|
| 查看次数: |
5147 次 |
| 最近记录: |