2012-11-17 12 views
6

Sto effettuando una chiamata Ajax al server. Il codice che devo eseguire può essere diviso in 3 gruppi.come eseguire javascript durante l'attesa della callback ajax

  1. codice che deve essere eseguito prima che i pro ajax chiamata effettuata (preparare l'oggetto JSON andare al server)
  2. codice che deve essere eseguito dopo che la chiamata AJAX è tornato (usa ciò che è stato inviato indietro dal server)
  3. Codice che deve essere eseguito tra il momento in cui l'utente preme un pulsante e il tempo in cui è stato eseguito tutto. Questo codice non ha bisogno dell'oggetto restituito JSON.

Sarebbe ideale eseguire il codice nel gruppo 3 dopo aver effettuato la chiamata ajax e prima che i risultati tornino per ottenere la migliore esperienza utente e prestazioni.

Questo può essere fatto?

Come?

+1

hai provato a leggere i documenti ?? Ci sono spiegazioni per tutti i tuoi casi http://api.jquery.com/jQuery.ajax/ – charlietfl

risposta

9

Molto semplicemente:

function someFunction() { 
    //1. code that needs to run before ajax 
    $.ajax({...}).done(function() { 
     //2. code that needs to be run after the ajax call has returned 
    }); 
    //3. code that needs to be run between the time the user presses 
    // a button and the time everything is done. 
} 

Questo funziona perché JavaScript è sincrona in esecuzione (a meno che non vengono utilizzati i lavoratori, ma che è estraneo a questo particolare problema). Il primo bit di codice verrà eseguito, quindi la chiamata ajax dirà al browser di avviare una richiesta XHR, ma someFunction non è stata completata, quindi continuerà ad essere eseguita in modo sincrono.

Al termine di someFunction, il flusso di controllo verrà aperto a tutti gli eventi asincroni che si verificano, conducendo infine al callback done.

Per essere sinceri, la programmazione asincrona orientata agli eventi non è facile per la maggior parte delle persone. È facile perdere la cognizione di quale codice dovrebbe verificarsi a che ora.

Ecco un esempio facilmente eseguibile di come asincrona comportamento funziona:

(function() { 
    alert(1); 
    setTimeout(function() { 
     alert(2); 
    }, 0); //note the 0ms delay 
    alert(3); 
}()); 

L'ordine degli allarmi sarà 1, 3, 2. setTimeout non chiamerà la sua callback in modo sincrono poiché si basa sull'attesa che trascorra il tempo specificato, quindi anche se non è previsto che scada il tempo, deve ancora attendere che la funzione corrente termini prima che possa continuare.

+0

+1 - Questo è qualcosa che molti sviluppatori hanno difficoltà ad afferrare. – dtbarne

+0

È '// 3' garantito che venga eseguito prima di' // 2'? Say '// 3' contiene un sacco di funzioni che impiegano molto tempo per calcolare/completare, non è possibile che // // 2' salti teoricamente nello stack di chiamate in qualsiasi momento durante l'esecuzione di qualunque cosa in' // 3'? Non intendo chiamate asincrone, sto solo pensando che dal momento che '// 2' è evento guidato l'evento potrebbe eventualmente sparare in qualsiasi punto dell'esecuzione. – Jan

+0

@Jan, il "licenziamento" di un evento asincrono sta semplicemente aggiungendo una chiamata di funzione al flusso di esecuzione * coda *. La coda passa alla successiva chiamata di funzione solo quando le funzioni precedentemente accodate hanno completato completamente l'esecuzione. Non è possibile combinare chiamate di funzioni a meno che non utilizzino esplicitamente il multi-threading come con i lavoratori. – zzzzBov

0

L'esecuzione di una chiamata Ajax quando si risponde a un evento client o in qualsiasi altro scenario consente di specificare il codice nei callback e il codice che viene eseguito immediatamente dopo la creazione del codice Ajax (non nel callback).

Esempio:

// Code before the ajax call is made 
$.ajax({ 
    params, //other key values such as data 
    success: function (data) { 
     // one of the possible callbacks 
    } 
}); 
// Code executed immediately after ajax call is performed 
// This is executed before or after the callback is complete 
// In most cases it's before 

Quindi, qualsiasi cosa eseguita prima della chiamata AJAX è fatta è garantito da eseguire prima. Qualsiasi cosa immediatamente dopo la chiamata ajax è quasi garantita per essere eseguita prima che venga richiamata la richiamata. Il callback è garantito per l'esecuzione dopo che il server ha restituito una risposta.

+0

"Questo è eseguito prima o dopo il callback è completo", stavo andando a downvotare questo, poiché le richiamate non possono accadere prima del suo completamento, ma poi ho ricordato che è possibile avere un callback sincrono se è usato come opzione . Non sono sicuro che mi piace come lo hai formulato, poiché implica che potrebbe verificarsi una richiamata asincrona prima che il flusso di controllo fosse rilasciato, cosa che non lo farà. – zzzzBov

+0

@zzzzBov È anche possibile avere un codice asincrono dopo il codice asincrono. Quindi non è garantito l'esecuzione prima del primo callback. Questo è il motivo per cui la mia risposta è tale. Sentiti libero di modificare se pensi di poter migliorare la mia risposta :) –

+0

la chiamata del codice asincrono (come 'setTimeout (fn, delay)') verrà eseguita prima che * qualsiasi * callback asincrona possa verificarsi. Dopo l'esecuzione della funzione, tutte le funzioni in coda verranno eseguite nell'ordine in cui sono state richiamate. Ad esempio, è possibile che la funzione callback "successi" utilizzi i dati memorizzati nella cache e accoda immediatamente il suo callback, ma sarà comunque garantito che si verifichi * dopo che * la funzione attualmente in esecuzione è terminata. – zzzzBov

Problemi correlati