問題在於for(var k=0; k< subitemCount ; k++){
聲明。
請注意,對於每個item.subitem
您正在進行一個ajax調用。並且在每個呼叫返回後,您正在呼叫done()
回叫。因此代碼實際上多次調用回調(即done()
)。一次爲每個阿賈克斯調用,因此每個item.subitem
一次。
這就是爲什麼你有未捕獲的錯誤:回調已被調用。
爲了避免這種情況,你需要再拍async.forEachOf
代替
嘗試使用這樣的:
async.forEachOf(code,function(item, index, doneItem){
var currentItemId = item.id;
var subitemCount = item.subitem;
async.forEachOf(subitemCount, function (subItem, subItemIndex, subItemDone){
$.ajax({
url: 'api/item' + subItemIndex,
success: function(result) {
code["allSub"].push(result);
subItemDone();
},
error: function(err) {
subItemDone(err);
}
})
}, function(err) {
//Called once all the current item's subItems ajax calls were finished
doneItem(err);
}
},function(){
//Called once all items in "code" finished their own subItem ajax calls
console.log(code);
});
如果item.subitem
是一個數值,而不是一個數組,你可以嘗試使用async.times
async.forEachOf(code,function(item, index, doneItem){
var currentItemId = item.id;
var subitemCount = item.subitem;
async.times(subitemCount, function (subItemIndex, subItemDone){
$.ajax({
url: 'api/item' + subItemIndex,
success: function(result) {
code["allSub"].push(results);
subItemDone();
},
error: function(err) {
subItemDone(err);
}
})
}, function(err, results) {
//Called once all subItem ajax calls were finished
doneItem(err);
}
},function(){
//Called once all items in "code" finished their own subItem ajax calls
console.log(code);
});