2012-04-23 17 views
12

Ciao Ho 2 chiamate ajax nel mio script, ho bisogno che eseguano asnyc per risparmiare tempo, ma ho bisogno che il secondo attenda fino al termine del primo.jQuery Attendi fino a quando le chiamate asincrone asincrone sono finite

$.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"); 
     } 
     }); 

Quindi qualche idea? Grazie

risposta

15

Se si utilizza jQuery 1.5+, è possibile utilizzare jQuery.when() per ottenere ciò. Qualcosa di simile (accorciato le chiamate ajax per brevità, solo passare gli oggetti come si sta facendo in precedenza)

$.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 ] 
}); 

Non sai in quale ordine torneranno quindi se si stavano rotolando tutto a mano, si sarebbe è necessario verificare lo stato dell'altra richiesta e attendere finché non è ritornato.

1

È necessario cablare la seconda chiamata da includere nella richiamata della prima chiamata ajax. In questo modo:

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

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

Poiché JavaScript pretende molto eseguito in più thread sul client, non è possibile bloccare il filo fino a quando vengono soddisfatte determinate condizioni.

+0

ma questo renderà il tempo di esecuzione più lungo, perché la seconda chiamata verrà avviata dopo il primo era finito, stavo pensando a qualcosa di simile a questo: nel primo successo invito posso impostare una variabile su true, e in secondo richiamo successo che posso fare while (variabile == false) {wait} e poi continua, ma non so come scriverlo correttamente – user1352324

+0

L'unico modo per fare un 'wait' sarebbe di 'setTimeout' e quindi controllare la variabile globale. Ma tecnicamente, ciò significa che il tuo timeout potrebbe accadere dopo che la chiamata è stata completata, ma è ancora in attesa. Sarebbe meglio mostrare semplicemente all'utente una gif rotante o qualcosa che indichi che il server sta funzionando. – Tejs

0

Ecco un'altra risposta sull'esecuzione di richieste dual ajax. Come Tejs, l'utente effettua una chiamata AJAX all'interno del metodo di successo ...

Il manifesto dichiara È meglio avere il metodo successo lanciare una nuova richiesta Ajax .."

Having two $.ajax() calls in one script

1

Utilizzando 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

Grazie per la risposta. L'ho modificato aggiungendo del codice per migliorare la leggibilità. – vlasits

+0

@vlasits che non sembrano renderlo audace come si potrebbe pensare, ho inviato una modifica con un commento per spiegare cosa stava succedendo – flyingfisch

Problemi correlati