nodejs阻止直到'迭代完成

时间:2016-12-01 15:01:55

标签: javascript node.js

我有这样的代码,并且'用于'没有执行。

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);

如何解决

2 个答案:

答案 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,也许使用BluebirdQ等库。

答案 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;
}