success example error data jquery ajax jquery-deferred

example - jQuery.when comprensión



jquery ajax post (3)

Estoy tratando de usar el jQuery.when para disparar dos solicitudes ajax y luego llamar a alguna función una vez que las dos solicitudes se hayan completado. Aquí está mi código:

var count = 0; var dfr; var showData = function(data) { dfr.resolve(); alert(count); // Do something with my data data received }; var method1 = function() { dfr = $.Deferred(); return $.ajax(''localhost/MyDataService/DataMethod_ReturnsData'', { dataType: "jsonp", jsonp: "$callback", success: showData }); }; var method2 = function() { return $.ajax(''localhost/MyDataService/DataMethod_ReturnsCount'', { dataType: "jsonp", jsonp: "$callback", success: function(data) { count = data.d.__count; } }); }; $.when(method1(), method2()) .then(showData());

Sin embargo, esto no está funcionando como se esperaba. La llamada de Ajax en el method1 devolverá los datos que se utilizarán en showData() y la llamada de Ajax en el method2 devolverá el recuento que se asignará al recuento de var y luego se usará en showData() .

Pero cuando disparo el código anterior, se llama a showData y luego a showData y luego a showData dejando los datos en showData como ''undefined'' . ¿Cómo puedo lograr esto a través de $.when que, por lo que sé, procede solo cuando se ejecutan las dos funciones que devuelven $.promise . Quiero que las llamadas ajax se llamen en paralelo y que los resultados posteriores se muestren en función de los resultados de ambas llamadas.


El problema es que está pasando showData() a then() , no showData . Debe pasar una referencia a una función para .then() :

$.when(method1(), method2()) .then(showData);

o

$.when(method1(), method2()) .then(function () { showData(); });

Editar

He creado una demostración funcional . Parte del problema (al menos en el fragmento de código que publicaste) era que no había una función de devolución de llamada llamada $callback . Parte del problema era $ en el nombre de devolución de llamada ''$callback'' .

Por lo tanto, elimine la jsonp: ''$callback'' ajax, de modo que jQuery jsonp: ''$callback'' manera predeterminada una función de callback llamada callback , y defina una función con ese nombre, y todo funciona.


He modificado un poco tu código y he sido más simple de entender ... no lo he probado, por favor pruébalo

var count = 0; function countResponse(data) { count++; if(count==2) { // Do something after getting responce from both ajax request } }; var method1 = function() { return $.ajax(''localhost/MyDataService/DataMethod_ReturnsData'', { dataType: "jsonp", jsonp: "$callback", success: function(data) { countResponse(data) } }); }; var method2 = function() { return $.ajax(''localhost/MyDataService/DataMethod_ReturnsCount'', { dataType: "jsonp", jsonp: "$callback", success: function(data) { countResponse(data) } }); };


function showData(data1, data2) { alert(data1[0].max_id); alert(data2[0].max_id); } function method1() { return $.ajax("http://search.twitter.com/search.json", { data: { q: ''ashishnjain'' }, dataType: ''jsonp'' }); } function method2() { return $.ajax("http://search.twitter.com/search.json", { data: { q: ''ashishnjain'' }, dataType: ''jsonp'' }); } $.when(method1(), method2()).then(showData);​

Aquí hay un jsFiddle trabajo