.When () et .done () en utilisant un tableau avec .done

J’écris un script de contenu Google et mon programme doit effectuer environ 30 appels AJAX sur le serveur. J’utilise la fonction .when de JQuery en conjonction avec .apply pour transmettre un tableau à la fonction .when. J’utilise également .done et je veux pouvoir transmettre un tableau d’arguments qui prendront les objects différés de la fonction .when. Y a-t-il un moyen de faire ça? C’est ce que j’essaie de faire.

var callback = function(a) { console.log("done", a); }; var requests = []; var requestArray = []; for(i = 0; i < liclass.length; i++) { requests.push($.ajax({ url: liclass[i], success: function() {; } })); var str = "messageArg" + i requestArray.push(str) } $.when.apply($, requests).done(function(requestArray){ callback(requestArray)}); 

Si vous regardez les exemples pour $.when , vous voyez que le rappel reçoit un argument pour chaque promesse. Si cette promesse venait d’un appel Ajax, chaque argument est un tableau de la forme [ data, statusText, jqXHR ] .

Donc, il ne vous rest plus qu’à parcourir les arguments et extraire le premier élément. $.map rend cela très facile:

 $.when.apply($, requests) .then(function() { return $.map(arguments, function(v) { return v[0]; }); }) .done(callback); 

Souhaitez-vous placer les réponses ajax dans un tableau et faire exécuter un rappel lorsque tous les appels ajax sont revenus? Vous pouvez réellement obtenir un tel tableau à partir des arguments passés à .done() .

Selon la documentation de $.when :

  1. Si vous appelez .done() sur la promesse renvoyée par $.when une seule demande ajax différée est transmise, le premier argument de la fonction de rappel sera les données de réponse.
  2. Si vous appelez .done() sur la promesse renvoyée par $.when plusieurs demandes ajax différées étant passées, les arguments seront les objects jqXHR pour les demandes, dans l’ordre indiqué dans la liste des arguments. ” Cette déclaration semble toutefois un peu inexacte, car un commentaire de l’exemple indique: “Chaque argument est un tableau présentant la structure suivante: [data, statusText, jqXHR].”

Par conséquent, vous pouvez essayer:

 var requests = $.map(liclass, function(url) { return $.ajax(url); }); $.when.apply($, requests).done(function() { var results = (requests.length > 1) ? $.map(arguments, function(a) { return a[0]; }) : [arguments[0]]; console.log(results); }); 

Démo sur JSFiddle

Je suis assez nouveau pour les choses différées (et jQuery en général), mais la fonction d’aide ci-dessous semble fonctionner. Aucune des requêtes ne dépend les unes des autres pour les données. Je vais probablement écrire une fonction d’assistance similaire pour gérer les requêtes chaînées, qui devra utiliser .then ().

 function sendRequests(requests, callbacks) { $.when(...requests).done(function(...results) { results.forEach(function(result, index) { callbacks[index](JSON.parse(result[0])); }); }); } function req1Callback(data) { // do something with data object } var req1 = $.get(), // arguments omitted req2 = $.get(), req3 = $.get(); sendRequests([ req1, req2, req3 ], [ req1Callback, req2Callback, req3Callback ]);