Usando jQuery, come posso annullare/abortire una richiesta Ajax di cui non ho ancora ricevuto la risposta?
La maggior parte dei metodi jQuery Ajax restituiscono un oggetto XMLHttpRequest (o l'equivalente), quindi si può semplicemente usare abort()
.
Vedere la documentazione:
var xhr = $.ajax({
type: "POST",
url: "some.php",
data: "name=John&location=Boston",
success: function(msg){
alert( "Data Saved: " + msg );
}
});
//kill the request
xhr.abort()
AGGIORNAMENTO: A partire da jQuery 1.5 l'oggetto restituito è un wrapper per l'oggetto nativo XMLHttpRequest chiamato jqXHR. Questo oggetto sembra esporre tutte le proprietà e i metodi nativi, quindi l'esempio precedente funziona ancora. Vedere L'oggetto jqXHR (documentazione API jQuery).
AGGIORNAMENTO 2:
A partire da jQuery 3, il metodo ajax ora restituisce una promessa con metodi extra (come abort), quindi il codice precedente funziona ancora, anche se l'oggetto restituito non è più un xhr
. Vedere il blog 3.0 qui.
AGGIORNAMENTO 3: xhr.abort()
funziona ancora su jQuery 3.x. Non assumere che l'aggiornamento 2 sia corretto. Maggiori informazioni sul repository Github di jQuery.
Non potete richiamare la richiesta ma potete impostare un valore di timeout dopo il quale la risposta sarà ignorata. Vedi questa pagina per le opzioni jquery AJAX. Credo che il tuo callback di errore sarà chiamato se il periodo di timeout viene superato. C'è già un timeout predefinito su ogni richiesta AJAX.
Potete anche usare il metodo abort() sull'oggetto della richiesta ma, mentre causerà l'interruzione dell'ascolto dell'evento da parte del client, probabilmente non impedirà al server di elaborarla.
È una richiesta asincrona, il che significa che una volta inviata è là fuori.
Nel caso in cui il tuo server stia iniziando un'operazione molto costosa a causa della richiesta AJAX, il meglio che puoi fare è aprire il tuo server per ascoltare le richieste di cancellazione, e inviare una richiesta AJAX separata per notificare al server di fermare qualsiasi cosa stia facendo.
Altrimenti, ignorate semplicemente la risposta AJAX.