我有一个在其中有异步调用的循环,带有回调。为了能够继续前进,我需要回调一直触发整个循环,然后显示循环的结果。
我试图控制它的每一种方式都不起作用(尝试过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
答案 0 :(得分: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');
}
}