Necesito hacer una serie de solicitudes N ajax sin bloquear el navegador, y quiero usar el objeto diferido jquery para lograr esto.Cómo encadenar llamadas ajax usando jquery
Aquí hay un ejemplo simplificado con tres solicitudes, pero mi programa puede necesitar hacer cola más de 100 (tenga en cuenta que este no es el caso de uso exacto, el código real necesita asegurar el éxito del paso (N-1) antes de ejecutar el paso siguiente):
$(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 + "]");
}
});
}
Esto es lo que se escribe en la consola (todas las solicitudes se realizan en paralelo y el tiempo de respuesta es directamente proporcional al tamaño de los datos de cada país como se esperaba:
Making request for [US]
Making request for [CA]
Making request for [MX]
Successful request for [MX]
Successful request for [CA]
Successful request for [US]
¿Cómo puedo obtener el objeto diferido para poner esto en cola para mí? Intenté cambiar hecho a tubo pero obtuve el mismo resultado.
Aquí es el resultado deseado:
Making request for [US]
Successful request for [US]
Making request for [CA]
Successful request for [CA]
Making request for [MX]
Successful request for [MX]
Editar:
I apreciar la sugerencia de utilizar una matriz para almacenar parámetros de la petición, pero el objeto jquery diferido tiene la capacidad de hacer cola solicitudes y Realmente quiero aprender a usar esta característica en todo su potencial.
Esto es efectivamente lo que estoy tratando de hacer:
when(request[0]).pipe(request[1]).pipe(request[2])... pipe(request[N]);
Sin embargo, quiero asignar las solicitudes en el tubo de un paso a la vez con el fin de utilizar eficazmente el recorrido de cada una:
deferred.pipe(request[0]);
deferred.pipe(request[1]);
deferred.pipe(request[2]);
Esta respuesta definitivamente funciona, estoy tratando de digerir todo, ya que es bastante complejo.¡Gracias! – Graham
Creo que estoy viendo esto ahora. La diferencia principal entre mi código original y el tuyo parece ser que estás creando objetos Diferidos para cada solicitud, donde el mío estaba tratando de usar un solo Diferido. ¿Estoy en lo correcto? – Graham
Algunas preguntas específicas para usted: (1) ¿por qué devuelve explícitamente una promesa cuando ya está devolviendo la promesa de la llamada ajax? (2) ¿por qué se asigna "esto" a "sí mismo"? (3) ¿por qué no eligió usar pipe() cuando esa es la función de cola jquery nativa? (4) Cuando estamos creando objetos diferidos para cada solicitud, ¿cuál es el requisito de memoria cuando empiezo a enviar cientos de solicitudes a la "cola"? ¿Qué tan ligero es un objeto diferido? – Graham