Come faccio a sapere se jQuery ha una richiesta Ajax in sospeso?


90

Ho dei problemi con un controllo jQuery che abbiamo creato. Supponiamo di avere un elenco a discesa che ti consente di inserire l'ID dell'articolo che stai cercando, e quando premi INVIO o perdi il focus in una casella di testo convalida tramite jQuery che l'ID che hai inserito è corretto, mostrando un avviso se non lo fa 't.

Il fatto è che quando un utente normale inserisce un valore non valido e perde il focus premendo il pulsante di invio, il messaggio jQuery ritorna dopo che l'invio del modulo è stato inviato.

C'è un modo per controllare se c'è un'elaborazione della richiesta Async da parte di jQuery in modo da non consentire l'invio del modulo?

Risposte:


37

È possibile utilizzare ajaxStart e ajaxStop per tenere traccia di quando le richieste sono attive.


Questo ha funzionato meglio per me, dal momento che il mio controllo veniva reso molte volte usando HtmlHelper. Grazie!
sabanito

Questo ha funzionato per me! Stavo usando ajaxSend e ajaxSuccess, ma alcune volte ho ricevuto diverse richieste ajax e volevo solo eseguire un pezzo di codice una volta all'inizio e una alla fine. ajaxStart e ajaxStop erano esattamente quello che stavo cercando! Grazie
ScottyG

2
Nel 2019 i collegamenti sono obsoleti
Kristian Nissen

228

$.active restituisce il numero di richieste Ajax attive.

Maggiori info qui


Questo in realtà risponde alla domanda. Grazie.
Dave Salomon

Una soluzione di linea e breve molto bella
MSTdev

25
 $(function () {
        function checkPendingRequest() {
            if ($.active > 0) {
                window.setTimeout(checkPendingRequest, 1000);
                //Mostrar peticiones pendientes ejemplo: $("#control").val("Peticiones pendientes" + $.active);
            }
            else {

                alert("No hay peticiones pendientes");

            }
        };

        window.setTimeout(checkPendingRequest, 1000);
 });

Sembra una buona soluzione ma, hai rilevato qualche problema con la "Dimensione massima dello stack di chiamate"?
Mikel

11

La funzione $ .ajax () restituisce un oggetto XMLHttpRequest. Memorizzalo in una variabile accessibile dall'evento "OnClick" del pulsante Invia. Quando viene elaborato un clic di invio, verificare se la variabile XMLHttpRequest è:

1) null, significa che nessuna richiesta è stata ancora inviata

2) che il valore readyState sia 4 (Loaded). Ciò significa che la richiesta è stata inviata e restituita correttamente.

In uno di questi casi, restituisci true e consenti all'invio di continuare. Altrimenti, restituisci false per bloccare l'invio e dare all'utente alcune indicazioni sul motivo per cui l'invio non ha funzionato. :)


4
Controllare se è nullo per determinare se l'oggetto request.readyState > 0 && request.readyState < 4richiesta esisteèimportante , ma se nonènullo dovresti veramente controllare per determinare una richiesta 'attiva' perché readyState 0 indica che sebbene l'oggetto sia stato creato, una richiesta web nonèstata iniziata .
Nathan Taylor

1

Dobbiamo utilizzare il metodo $ .ajax.abort () per interrompere la richiesta se la richiesta è attiva. Questo oggetto promise utilizza la proprietà readyState per verificare se la richiesta è attiva o meno.

HTML

<h3>Cancel Ajax Request on Demand</h3>
<div id="test"></div>
<input type="button" id="btnCancel" value="Click to Cancel the Ajax Request" />

Codice JS

//Initial Message
var ajaxRequestVariable;
$("#test").html("Please wait while request is being processed..");

//Event handler for Cancel Button
$("#btnCancel").on("click", function(){
if (ajaxRequestVariable !== undefined)

if (ajaxRequestVariable.readyState > 0 && ajaxRequestVariable.readyState < 4)
{
  ajaxRequestVariable.abort();
  $("#test").html("Ajax Request Cancelled.");
}
});

//Ajax Process Starts
ajaxRequestVariable = $.ajax({
            method: "POST",
            url: '/echo/json/',
            contentType: "application/json",
            cache: false,
            dataType: "json",
            data: {
        json: JSON.encode({
         data:
             [
                            {"prop1":"prop1Value"},
                    {"prop1":"prop2Value"}
                  ]         
        }),
        delay: 11
    },

            success: function (response) {
            $("#test").show();
            $("#test").html("Request is completed");           
            },
            error: function (error) {

            },
            complete: function () {

            }
        });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.