2011-03-23 64 views
7

Estoy teniendo un problema para hacer ajax rápido y funcional. Aquí está el código de pseudo/prototipo:jQuery Ajax: ¿cómo esperar hasta que las solicitudes * async * finalicen antes de continuar?

function blah1(arg1){//arg1 is an array, roughly 10 elements 

var arr[]; 

$.each(arg1, function(i){ 
//blah code 

    $.ajax({ 
     //blah options 
     async: true, 
     success: function(data){ 
      arr[i] = data.someInt; 
     }//end success 
    });//end ajax 
}//end each 

return arr; 
}//end function 

Básicamente, estoy enviando un Ajax y necesitan los datos devueltos para su posterior procesamiento.

Si configuro async en true, la función devuelve inmediatamente una matriz 'arr' vacía, por lo que falla todo el script. Pero si configuro async en falso, entonces funciona, pero lleva mucho tiempo.

He visto esto $.ajaxQueue();, pero francamente no lo entiendo del todo, y no sé si funcionará.

Entonces, la pregunta es, en primer lugar, ¿hay alguna forma de poder enviar asíncronamente todas las solicitudes ajax al mismo tiempo y dejar que la función espere y devuelva arr [] después de que se hagan todos los ajax? Si no, ¿funcionará el ajaxQueue en mi caso? (ejemplo aproximado, por favor?)

+0

¿No puede enviarlo todo en una sola solicitud AJAX y analizar los resultados de todas las 10 respuestas? – Peeter

+0

Eso es posible, pero eso significa que tendré que hacer la edición por el lado del servidor y eso es todo un desastre en el que me puedo meter. Preferiría hacerlo en jQuery. – JQonfused

+0

1 solicitud es mejor que 10+ solicitudes. Usted terminará golpeando el límite de solicitud de navegadores. – Peeter

Respuesta

4

Podrías hacer la llamada Ajax sincrónica que pareces conocer, en lo personal volvería a factorizar mi código para que el método de éxito de la llamada ajax active una llamada a otra función.

$.ajax({ 
     //blah options 
     async: true, 
     success: function(data){ 
      arr[i] = data.someInt; 
      myCall(arr[i]); 
     }//end success 
    });//end ajax 
5

usando jQuery 1.5 de diferidos optaría por esto:

function blah1(arr, callback){ 
    $.when($.map(arr, function(val, i){ 
     $.ajax({ 
      //blah options 
      async: true 
     }); 
    }).toArray()).then(function(resultsArr) { 
     callback(resultsArr); 
    }); 
} 

El problema era que estaba tratando de devolver la matriz en su función antes del asíncrono llamadas ajax terminen. Esto no es realmente posible, así que tendrás que pasar una devolución de llamada para bla.

Lo que hace aquí es mapear su matriz de objetos a los objetos jqXHR (que son objetos diferidos). Luego pasando esa matriz de objetos diferidos a $.when.

$.when toma una matriz y luego se le permite ejecutar la función .then cuando toda la matriz ha terminado de cargar de las llamadas ajax. A continuación, tiene un resultsArr pasado como un argumento para su función .then.

No hay forma de usar $.ajax y return en la misma función si manipula el valor de retorno en su llamada exitosa ajax.

Cuestiones relacionadas