¿Cómo sé si jQuery tiene una solicitud Ajax pendiente?


90

Tengo algunos problemas con un control jQuery que hicimos. Suponga que tiene una lista desplegable que le permite ingresar el ID del artículo que está buscando, y cuando presiona ENTER o pierde el foco en un cuadro de texto, valida a través de jQuery que el ID que ingresó es correcto, mostrando una alerta si no lo hace 't.

El caso es que cuando un usuario común ingresa un valor no válido en él y pierde el foco al presionar el botón Enviar, la publicación de jQuery regresa después de que se envió el envío del formulario.

¿Hay alguna forma de que pueda verificar si jQuery procesa alguna solicitud Async para no permitir el envío del formulario?

Respuestas:


37

Puede usar ajaxStart y ajaxStop para realizar un seguimiento de cuándo las solicitudes están activas.


Esto funcionó mejor para mí, ya que mi control se procesaba muchas veces usando HtmlHelper. ¡Gracias!
sabanito

¡Esto funcionó para mí! Estaba usando ajaxSend y ajaxSuccess, pero algunas veces me enviaron varias solicitudes de ajax y solo quería ejecutar una parte del código una vez al principio y una vez al final. ¡ajaxStart y ajaxStop era exactamente lo que estaba buscando! Gracias
ScottyG

2
En 2019, los enlaces están desactualizados
Kristian Nissen

228

$.active devuelve el número de solicitudes Ajax activas.

Más info aquí


Esto realmente responde a la pregunta. Gracias.
Dave Salomon

Un trazador de líneas y una solución corta muy agradable
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);
 });

Parece una buena solución pero, ¿ha detectado algún problema con el "Tamaño máximo de pila de llamadas"?
Mikel

11

La función $ .ajax () devuelve un objeto XMLHttpRequest. Almacene eso en una variable a la que se pueda acceder desde el evento "OnClick" del botón Enviar. Cuando se procesa un clic de envío, verifique si la variable XMLHttpRequest es:

1) nulo, lo que significa que aún no se ha enviado ninguna solicitud

2) que el valor readyState es 4 (cargado). Esto significa que la solicitud se envió y se devolvió correctamente.

En cualquiera de esos casos, devuelva verdadero y permita que el envío continúe. De lo contrario, devuelva falso para bloquear el envío y darle al usuario alguna indicación de por qué su envío no funcionó. :)


4
Es importante verificar si hay nulo para determinar si el objeto de solicitud existe, pero si no es nulo, realmente debe verificar request.readyState > 0 && request.readyState < 4para determinar una solicitud 'activa' porque readyState 0 indica que aunque el objeto se ha creado, no se ha iniciado una solicitud web .
Nathan Taylor

1

Tenemos que utilizar el método $ .ajax.abort () para cancelar la solicitud si la solicitud está activa. Este objeto de promesa usa la propiedad readyState para verificar si la solicitud está activa o no.

HTML

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

Código 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 () {

            }
        });
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.