Je dois faire 2 appels à une API qui contiennent chacune une partie du total des données, qui doivent ensuite être itérées. L’appel 1 obtient deux objects jsonp:
[{ "id": 17, "name": "A", "campaign_code": "CAP20481" },{ "id": 18, "name": "B", "campaign_code": "CAP20481" }]
L’appel 2 utilise l’ID du premier appel pour obtenir un entier. J’ai alors besoin du “nom” et du nombre entier correspondants. Jusqu’à présent j’ai:
function getStoreCounts() { var campaignID = $("input[title='Campaign ID']").val(); var storeLists = $.ajax({ type: "GET", dataType: "jsonp", url: "/apiIndex?callback=?&campaign_code=" + campaignID.toSsortingng(), }), storeCount = storeLists.then(function(data) { $.each(data,function(i,storeList){ $.extend(storeList,{stores:''}); var getCount = $.ajax({ type: "GET", dataType: "jsonp", url: "/apiStoreCount?callback=?&list_id=" + storeList.id.toSsortingng(), }); getCount.done(function(count) { storeList.stores = count; }); }); return data; }); storeCount.done(function(data) { console.log(data); $.each(data,function(i,tierCount){ console.log("Tier: "+tierCount.name); console.log("Stores: "+tierCount.stores); }); }); }
À la fin de la promesse, lorsque je ferme le tableau de données dans son intégralité, les valeurs stockées de chaque object sont intactes. Mais lorsque j’essaie de parcourir chaque object du tableau, il me manque la valeur des magasins. Sortie jointe de Chrome.
Vous devez attendre que toutes les promesses intérieures soient résolues. $.when
storeCount = storeLists.then(function(data) { // array of promises var counting = $.map(data,function(storeList){ $.extend(storeList,{stores:''}); var getCount = $.ajax({ type: "GET", dataType: "jsonp", url: "/apiStoreCount?callback=?&list_id=" + storeList.id.toSsortingng(), }); return getCount.then(function(count) { storeList.stores = count; }); }); // wait for all return $.when.apply($, counting).then(function() { return data; //return modified data }) });
Et une note sur le nom de convetion. Votre fonction s’appelait getStoreCounts
mais renvoie undefined
. Laissez-le retourner la promesse finale.
function gettingStoreCounts() { var campaignID = $("input[title='Campaign ID']").val(); var storeLists = $.ajax({...}), return storeLists.then(...); }
Et utiliser le résultat côté appel
gettingStoreCounts().then(/*log, whatever*/)