J'ai besoin de faire une série de N requêtes ajax sans verrouiller le navigateur, et je veux utiliser l'objet différé jquery pour y parvenir.
Voici un exemple simplifié avec trois demandes, mais mon programme peut avoir besoin de mettre en file d'attente plus de 100 demandes (notez que ce n'est pas le cas d'utilisation exact, le code actuel doit s'assurer du succès de l'étape (N-1) avant d'exécuter l'étape suivante) :
$(document).ready(function(){
var deferred = $.Deferred();
var countries = ["US", "CA", "MX"];
$.each(countries, function(index, country){
deferred.pipe(getData(country));
});
});
function getData(country){
var data = {
"country": country
};
console.log("Making request for [" + country + "]");
return $.ajax({
type: "POST",
url: "ajax.jsp",
data: data,
dataType: "JSON",
success: function(){
console.log("Successful request for [" + country + "]");
}
});
}
Voici ce qui est écrit dans la console (toutes les requêtes sont faites en parallèle et le temps de réponse est directement proportionnel à la taille des données pour chaque pays comme prévu :
Making request for [US]
Making request for [CA]
Making request for [MX]
Successful request for [MX]
Successful request for [CA]
Successful request for [US]
Comment puis-je faire en sorte que l'objet différé les mette en file d'attente pour moi ? J'ai essayé de remplacer done par pipe mais j'obtiens le même résultat.
Voici le résultat souhaité :
Making request for [US]
Successful request for [US]
Making request for [CA]
Successful request for [CA]
Making request for [MX]
Successful request for [MX]
Edit :
J'apprécie la suggestion d'utiliser un tableau pour stocker les paramètres de la requête, mais l'objet différé jquery a la capacité de mettre les requêtes en file d'attente et je veux vraiment apprendre à utiliser cette fonctionnalité à son plein potentiel.
C'est effectivement ce que j'essaie de faire :
when(request[0]).pipe(request[1]).pipe(request[2])... pipe(request[N]);
Cependant, je veux affecter les demandes dans le tuyau une étape à la fois afin d'utiliser efficacement chaque traversée :
deferred.pipe(request[0]);
deferred.pipe(request[1]);
deferred.pipe(request[2]);