variable por pasar llamar funcion formulario example enviar ejemplos ejemplo desde data javascript jquery jquery-deferred promise

javascript - por - Objeto diferido jQuery con llamadas ajax anidadas



llamar funcion php desde javascript ajax (3)

En realidad es bastante simple. Aunque todas las llamadas AJAX son objetos Diferidos, aún utilizo uno para el método en sí.

function nestedAjax() { var dfd = $.Deferred(); $.get("/echo/json/", function(){ console.log("First ajax done."); $.get("/echo/json/", function(){ console.log("Second ajax done."); dfd.resolve(); }); }); return dfd.promise(); };

Tengo una situación en la que mis llamadas ajax deben realizarse en un orden particular. He usado objetos jQuery diferidos en otras situaciones, pero parece que no puedo encontrar una manera de hacer que esto se comporte de manera adecuada.

Tengo una función que realiza una serie de solicitudes ajax en su tiempo de vida. Algunas de las solicitudes se realizarán durante la devolución exitosa de otras solicitudes.

Mi pregunta: ¿hay alguna manera de devolver todos los objetos aplazados anidados a la llamada $.when original?

Un ejemplo simplificado sería:

function nestedAjax() { $.get("/", function(){ console.log("First ajax done."); $.get("/", function(){ console.log("Second ajax done."); }); }); };

Estoy tratando de tener la función nestedAjax para usar $.when() y $.done() así:

$.when(nestedAjax()).done(function(){ console.log("Complete"); });​

Con la lectura de salida de la consola:

> First ajax done. > Second ajax done. > Complete.

Puedo devolver el primer get para lograr esto:

> First ajax done. > Complete. > Second ajax done.

Pero obviamente esto no es lo que requiero. Cualquier ayuda sería apreciada.


No se pudo agregar un comentario por alguna razón a la respuesta anterior.

Entonces agrego mi comentario aquí. La respuesta anterior solo funcionará si las llamadas ajax son rápidas y regresa ANTES del retorno dfd.promise ().

Tengo el mismo problema. Y como puedes ver El objeto diferido devuelto declara que está "pendiente": http://jsfiddle.net/BtEKa/


En realidad, no necesita un objeto diferido adicional. Puedes hacer lo que quieras al encadenar con then() :

function nestedAjax() { return $.get("/echo/json/").then(function(result1){ console.log("First ajax done."); if (result1) { return result1; } else { return $.get("/echo/json/").then(function(nestedResult){ console.log("Second ajax done."); return nestedResult; }); } }); };

Agregué un poco de lógica ya que creo que esa es probablemente la razón por la que está ejecutando esto de forma sincrónica. Después de eso puedes usar el resultado en $.when así sea así:

$.when(nestedAjax(), $.get("/something/else")).then(function(nested, other) { console.log("Complete.", nested, other); });