2012-04-23 16 views
12

Hola Tengo 2 llamadas ajax en mi secuencia de comandos, las necesito ejecutar asnyc para tener tiempo libre, pero necesito que la segunda espere hasta que termine la primera.jQuery Espere hasta que las llamadas async ajax hayan finalizado

$.ajax({ 
     type: "POST", 
     url: "getText.asmx/ws_getText", 
     data: parO1, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (msg) { 
      alert(msg.d.data); 
     } 
     , error: function() { 
      chyba("chyba v požadavku", "df"); 
     } 
    }); 
    if (parO2.length > 0) { 
     $.ajax({ 
      type: "POST", 
      url: "getText.asmx/ws_getText", 
      data: parO2, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (msg) { 
       /*WAIT UNTIL THE FIRST CALL IS FINISHED AND THAN DO SOMETHING*/ 
      } 
     , error: function() { 
      chyba("chyba v požadavku", "df"); 
     } 
     }); 

¿Alguna idea? Gracias

Respuesta

15

Si usa jQuery 1.5+, puede usar jQuery.when() para lograr esto. Algo así como (abreviado las llamadas ajax Por razones de brevedad, sólo tiene que pasar los objetos a medida que estás haciendo anteriormente)

$.when($.ajax("getText.asmx/ws_getText"), 
     $.ajax("getText.asmx/ws_getText")).done(function(a1, a2){ 

    // a1 and a2 are arguments resolved for the 
    // first and second ajax requests, respectively 
    var jqXHR = a1[2]; // arguments are [ "success", statusText, jqXHR ] 
}); 

Usted no sabe en qué orden van a regresar por lo que si rodaban esto a mano, que se necesita verificar el estado de la otra solicitud y esperar hasta que haya regresado.

1

Necesita cablear la segunda llamada que se incluirá en la devolución de llamada de su primera llamada ajax. De este modo:

success: function(msg) 
{ 
    alert(msg.d.data); 

    if(par02.length > 0) 
    { 
     // Your 2nd ajax call 
    } 
}, 

Desde JavaScript DOESNT ejecutan en múltiples hilos en el cliente, no se puede bloquear el hilo hasta que se cumplan ciertas condiciones.

+0

pero esto hará que el tiempo de ejecución más largo porque la segunda llamada se pondrá en marcha después de que el primero fue terminado, yo estaba pensando en algo como esto: en primer éxito llamado i puede establecer alguna variable en true, y en segundo éxito de llamadas que puedo hacer while (variable == false) {wait} y luego continuar, pero no sé cómo escribir esto correctamente – user1352324

+0

La única manera de hacer una 'espera' sería 'setTimeout' y luego verificar su variable global. Pero técnicamente, eso significa que su tiempo de espera puede pasar después de que se realiza la llamada, pero todavía está esperando. Sería mejor que simplemente le muestre al usuario un gif giratorio o algo para indicar que el servidor está funcionando. – Tejs

0

Aquí hay otra respuesta sobre la ejecución de solicitudes dobles de ajax. Al igual que Tejs, el usuario realiza una llamada AJAX dentro del método de éxito ...

El cartel afirma Es mejor que tener el método de éxito lanzar una nueva petición ajax .."

Having two $.ajax() calls in one script

1

Uso jQuery

$.ajax({ 
     type: "POST", 
     async:false, // ** CHANGED ** 
     url: "getText.asmx/ws_getText", 
     data: parO1, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (msg) { 
      alert(msg.d.data); 
     } 
     , error: function() { 
      chyba("chyba v požadavku", "df"); 
     } 
    }); 
+0

Gracias por su respuesta. Lo edité agregando algunos formatos de código para mejorar la legibilidad. – vlasits

+0

@vlasits que no parecían ponerlo en negrita como uno pensaría, envié una edición con un comentario para explicar lo que estaba sucediendo – flyingfisch

Cuestiones relacionadas