我有这样的代码,并且'用于'没有执行。
var obj = [];
for (var i = 0, len = param.destinations.length; i < len; i++) {
var params = {
origins: param.origins,
destinations: param.destinations[i]
}
test(params, function(err, response) {
console.log(response);
return obj.push(response);
})
}
console.log(obj);
return callback(null, obj);
如何解决
答案 0 :(得分:1)
问题是你同时运行:
console.log(obj);
return callback(null, obj);
在触发任何测试回调之前。无论循环是否运行,它始终为[]
。
一个简单的解决方案是这样的:
var obj = [];
var n = 0;
for (var i = 0, len = param.destinations.length; i < len; i++) {
var params = {
origins: param.origins,
destinations: param.destinations[i]
}
test(params, function(err, response) {
console.log(response);
obj.push(response);
if (++n === len) {
console.log(obj);
callback(null, obj);
}
})
}
你需要有一个计数器来查看已经调用了多少回调,并且在最后一个回调中做了你需要的回调。
这是一个手动解决方案,对于这样的简单案例很有用。对于更复杂的情况,您可能希望使用async或使用promises,也许使用Bluebird或Q等库。
答案 1 :(得分:0)
我怀疑test()函数看起来非常像异步函数,可能会遇到数据库或其他一些I / O.如果是这种情况,则可以在将anthing放入obj之前达到return语句。确保test()是同步的,因此阻塞。另一种看待这种情况的方法是async函数不能是循环的一部分,它是同步的。 Zalgo打来电话!
因此,如果使async不是一个选项,最简单的方法是创建一个变量来计算响应的test()回调数。然后,如果回调数等于您发送的回调数,则进行最终回调。
$action = trim($_REQUEST['action']);
switch($action){
case 'add':
// insert query here
break;
case 'remove':
// delete query here
break;
}