該解決方案有點冗長,但尊重任務的分離。其模式類似於kriskowal的q.all
。
var arr = [], limit = 10, i=0, terminated_operations = 0;
while (i < limit) {
async_operation(arg, function(err, data) {
if (!err) {
arr.push(data);
operationTerminated(arr);
}
});
}
function operationTerminated(data) {
terminated_operations++;
if(terminated_operations === limit - 1) {
doStuff(data);
terminated_operations = 0;
}
}
function doStuff(data) {
console.log('all data returned', data);
}
第一個代碼段代表了核心邏輯。第二個函數只是第三個函數聲明的觸發器。
編輯:
爲了在標題原來的問題回答
我怎樣才能確保異步操作不保留在我的代碼陣列是空的?
我建議在async_operation
失敗的情況下返回data=undefined
,所以你可以接受也[]
作爲有效的返回值,並保持在覈心邏輯較高的控制。通過這種方式,您可以將環路重寫爲:
while (i < limit) {
async_operation(arg, function(err, data) {
if(err) {
console.error('error occurred', err);
break;
}
if(data) {
arr.push(data);
operationTerminated(arr);
}
});
}
如果您發現我的答案有用,您會考慮投票/接受我的答案嗎?謝謝。 – morels