uso una llamar funciones funcion estructura ejemplos jquery jquery-deferred

funciones - llamar una funcion jquery



jQuery.when solución de problemas con un número variable de argumentos (4)

Tengo un problema con el uso de jQuery.when () para esperar a que finalicen varias solicitudes ajax antes de llamar a otra función.

Cada solicitud ajax obtendrá datos JSON, y se ve algo así:

function loadData(arg){ var ajaxCall = $.ajax( URL // depends on arg ) .error( .... ); return ajaxCall; }

Cuando se llama a la solicitud, el valor de retorno (ajaxCall) se agrega a una lista llamada ajaxRequests.

ajaxRequests = []; ajaxREquests.push(loadData(arg))

Cuando se han realizado todas las solicitudes, estoy intentando pasar ajaxRequests a $ .when para esperar a que se completen todas las solicitudes.

var defer = $.when.apply($, ajaxRequests); defer.done(function(args){ for (var i=0; i<args.length; i++){ inst.loadData($.parseJSON(args[i].responseText)); } inst.draw(); });

inst es un objeto que carga y dibuja gráficos basados ​​en datos JSON.

El problema es que no parece estar realmente esperando a que finalicen las solicitudes: args [i] es un objeto, pero responseText no está definido cuando se ejecuta el código. Si guardo args [i] y accedo a él más tarde desde la consola, funciona.

Sospecho que el problema está relacionado con el uso de .when con un número arbitrario de argumentos, ya que todos los ejemplos que he visto en la web le dan una lista de argumentos predefinida.

No estoy seguro de si utilizar aplicar fue la idea correcta o no, pero de cualquier manera no funciona correctamente y se comporta de forma errática (depende del navegador).

Cualquier ayuda sería muy apreciada.

Por favor, avíseme si se requiere más información.
Estoy usando jQuery 1.5


Además de la respuesta de Andy Corman (todavía no puedo responder a una publicación, creo ...), si solo tiene una solicitud, la información de respuesta se pasará directamente a la función defer.done - como argumento; Por lo tanto, debe proporcionar un if para ese caso:

// Array of requests var requests = Array(); requests.push($.get(''responsePage.php?data=foo'')); var defer = $.when.apply($, requests); defer.done(function(){ // This is executed only after every ajax request has been completed if (requests.length == 1) // "arguments" will be the array of response information for the request else $.each(arguments, function(index, responseData){ // "responseData" will contain an array of response information for each specific request }); });


Aunque Alex sí proporcionó una solución a su problema, me resultó un poco difícil seguirlo. Tuve un problema similar al suyo que resolví, y quería compartir mi solución para cualquier otra persona que necesite procesar un número variable de solicitudes de ajax.

// Array of requests var requests = Array(); requests.push($.get(''responsePage.php?data=foo'')); requests.push($.get(''responsePage.php?data=bar'')); var defer = $.when.apply($, requests); defer.done(function(){ // This is executed only after every ajax request has been completed $.each(arguments, function(index, responseData){ // "responseData" will contain an array of response information for each specific request }); });


Creo que ya lo resolví, el problema estaba en el procesamiento de los argumentos devueltos. .done solo recibía tres argumentos: el texto de respuesta, el estado y el objeto jqXHR. Esperaba que se pasara el objeto jqXHR resultante de cada consulta.

Lo resolví moviendo el código de devolución de llamada para cada consulta a una función separada (es decir, la llamada ajax en loadData ahora está especificando una función de devolución de llamada que hace la llamada ''.loadData (...)'') y lo único que se está haciendo por el .done call es el inst.draw (). Esto parece funcionar bien: cada devolución de llamada individual se ejecuta antes que .done ().

No estoy seguro de si eso es exactamente cómo se supone que debe funcionar, pero parece estar haciendo el trabajo.