2017-02-23 65 views
0

我正在循環查看一個列表,併爲每個項目執行ajax調用,這會返回數據。我試圖在每個項目完成時再做一次回調。我這裏有一些代碼,不工作,但希望能做出什麼,我試圖做的意義:在循環中等待多個被緩存的對象

var dfdArray = []; 
$.each(setting, function (i, item) { 
    $.when(getCompany(item.CompanyId)).done(function (result) { 
     var dfd = new $.Deferred(); 
     dfdArray.push(dfd); 
     getData(result.company[0]).done(function (data) { 
      setting.Pipes = data.pipes; 
      setting.Deals = data.deals; 

      // Here is where I want to continue 
      // to the final callback when each is resolved 
      dfd.resolve(); 
     }); 
    }); 
}); 

$.when.apply($, dfdArray).done(function() { 
    // Do some other stuff 
}); 
+1

是否要一個接一個地或同時執行呼叫? –

+0

@BenjaminGruenbaum與此同時,而是繼續在 – tqrecords

+1

你是非常接近每個「設置」中有數據,雖然你有[解析構造(http://stackoverflow.com/questions/23803743/what-is-the-顯式承諾構造反模式和如何做我避免它/ 23803744#23803744) –

回答

-1

我可能已經過於複雜的事情。我只能使用一個延遲對象來解決它。然而,這些調用完成後,它不是一個完全異步的解決方案。如果有人能找到更好的方法,請打開建議。

var dfd = $.Deferred(); 
$.each(setting, function(i, item) { 
    $.when(getCompany(item.CompanyId)).done(function(result) { 
     var company = result.company[0]; 
     $.when(getData(company)).done(function(data) { 
      item.Pipes = data.pipes; 
      item.Deals = data.deals; 

      // Resolve dfd when last row is filled with data 
      if (i == setting.length - 1) dfd.resolve(); 
     }); 
    }); 
}); 

$.when(pipedriveDfd).done(function() { 
    // Do some other stuff 
}); 
+0

如果'getCompany()'和'getData()'返回承諾,則調用不需要被包裝在'$ .when()'中。 –

+0

'settings'是迭代的數組/對象,所以'setting.Pipes = data.pipes; setting.Deals = data.deals;'在循環中沒有意義。當然,你應該設置每個「項目」的屬性? –

+0

@ Roamer-1888這是一個錯字... – tqrecords