Das Problem liegt in der for(var k=0; k< subitemCount ; k++){
Deklaration.
Beachten Sie, dass Sie für jeden item.subitem
einen Ajax-Anruf tätigen. Und nachdem Sie jeden dieser Anrufe zurückgegeben haben, rufen Sie den Rückruf done()
an. Daher ruft der Code den Rückruf (d. H. done()
) mehrmals auf. Einmal für jeden Ajax Anruf und damit einmal für jeden item.subitem
.
Deshalb haben Sie die Uncaught Error: Callback wurde bereits aufgerufen.
Um dies zu vermeiden, sollten Sie eine andere async.forEachOf
anstelle des
Versuchen Sie es mit dieser machen müssen:
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);
});
Wenn item.subitem
ist ein numerischer Wert anstelle eines Arrays, können Sie versuchen Sie es mit dem 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);
});