2016-10-26 31 views
0

我正試圖實現以下場景。但在執行時出現錯誤未捕獲的錯誤:回調已被調用。異步給回調已被稱爲錯誤?

任何人都可以找到我做錯了什麼?

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

回答

1

問題在於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); 
});