2016-10-26 3 views
0

Ich versuche, das folgende Szenario zu erreichen. Aber während der Ausführung bekomme ich einen Fehler Uncaught Error: Callback wurde bereits aufgerufen.async geben Callback bereits als Fehler bezeichnet?

Kann jemand finden, was ich falsch mache?

async.forEachOf(code,function(item, index, done){ 
    var currentItemId = item.id;  
    var subitemCount = item.subitem; 
    for(var k=0; k< subitemCount ; k++){ 
     $.ajax({ 
      url: 'api/item' + k, 
      success: function(result) {    
      code["allSub"].push(result); 
      done(); 
      }, 
      error: function(err) {     
       done(err);    
      } 
     }) 
    } 
},function(){ 
    console.log(code); 
}); 

Antwort

1

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); 
}); 
Verwandte Themen