2016-12-01 45 views
0

我有这样的代码,'for'没有执行。nodejs块,直到'for'迭代完成

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

if'param.destinations.length' == 0,你永远不会为 – Fefux

+0

做param.destinations有长度吗? – yBrodsky

+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

+0

如何解决运行回调,直到'for'完成? –

+0

@AanElzam只有在循环计数器到达计数器的最后一个索引时才会调用回调 –

+0

@AanElzam或者您可以使用专门为此设计的Promise – Fefux

0

我怀疑test()函数看起来非常像异步函数,可能会碰到一个数据库或其他一些I/O。如果是这种情况,那么你的return语句可以在anthing被放入你的obj之前达成。确保test()是同步的,因此阻塞。另一种看待这个问题的方式是异步函数不能成为循环的一部分,这是同步的。扎尔戈呼叫!

因此,如果使它不是一个选项,最简单的方法是创建一个变量来计算响应的test()回调的数量。然后,如果回调数等于您发送的回调数,则执行最终回调。

var obj = []; 
var testsCompleted = 0; 
var len = param.destinations.length; 
      for (var i = 0; i < len; i++) { 
       var params = { 
        origins: param.origins, 
        destinations: param.destinations[i] 
       } 
       test(params, function(err, response) { 
        console.log(response); 
        obj.push(response); 
        testsCompleted++; 
        if (testsCompleted == len){ 
         console.log(obj); 
         return callback(null, obj); 
       } 
     }) 
}