2011-07-20 128 views
8

我有一个循环,它内部有一个异步调用,并带有回调。为了能够继续前进,我需要将回调触发整个循环,然后显示循环的结果。Node.js:在继续之前等待循环中的回调

我试图控制这个的每一个方法都行不通(已经尝试过Step,Tame.js,async.js和其他) - 关于如何前进的建议?

array = ['test', 'of', 'file']; 
array2 = ['another', 'array']; 

for(i in array) { 
    item = array[i]; 
    document_ids = new Array(); 

    for (i2 in array2) { 
     item2 = array2[i2]; 
     // look it up 
     mongodb.find({item_name: item2}).toArray(function(err, documents { 
      // because of async, 
      // the code moves on and calls this back later 
      console.log('got id'); 
      document_ids.push(document_id); 
     })) 
    } 

    // use document_ids 
    console.log(document_ids); // shows [] 
    console.log('done'); 
} 

// shows: 
// [] 
// done 
// got id 
// got id 

回答

10

您在启动回调之前记录了document_ids。你必须跟踪你完成后有多少次回调。

一个简单的方法是使用计数器,并检查每个回调计数。

以你的例子

var array = ['test', 'of', 'file']; 
var array2 = ['another', 'array']; 
var document_ids = []; 

var waiting = 0; 

for(i in array) { 
    item = array[i]; 

    for (i2 in array2) { 
     item2 = array2[i2]; 
     waiting ++; 

     mongodb.find({item_name: item2}).toArray(
      function(err, document_id) { 
       waiting --; 
       document_ids.push(document_id); 
       complete(); 
      }) 
     ); 
    } 
} 

function complete() { 
    if (!waiting) { 
     console.log(document_ids); 
     console.log('done');  
    } 
} 
+1

非常感谢您!我在async.js的帮助下修改了这个,并让它工作。 –

相关问题