Como posso saber se o jQuery tem uma solicitação Ajax pendente?


90

Estou tendo alguns problemas com um controle jQuery que fizemos. Suponha que você tenha uma lista suspensa que permite inserir o ID do item que está procurando, e quando você pressiona ENTER ou perde o foco em uma caixa de texto, ele valida via jQuery se o ID que você inseriu está correto, mostrando um alerta se não 't.

O fato é que quando um usuário comum insere um valor inválido nele e perde o foco pressionando o botão enviar, o post do jQuery retorna após o envio do formulário.

Existe alguma maneira de verificar se há algum processamento de solicitação Async por jQuery para não permitir o envio do formulário?

Respostas:


37

Você pode usar ajaxStart e ajaxStop para controlar quando as solicitações estão ativas.


Isso funcionou melhor para mim, já que meu controle estava sendo renderizado muitas vezes usando HtmlHelper. THX!
— sabanito

Isso funcionou para mim! Eu estava usando ajaxSend e ajaxSuccess, mas algumas vezes recebi várias solicitações de ajax e só queria executar uma amostra do código uma vez no início e uma vez no final. AjaxStart e ajaxStop eram exatamente o que eu procurava! Obrigado
— ScottyG

2
Em 2019 os links estão desatualizados
— Kristian Nissen de

228

$.active retorna o número de solicitações ativas do Ajax.

Mais informações aqui


Isso realmente responde à pergunta. Obrigado.
— Dave Salomon de

Um liner e solução curta muito boa
— 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 uma boa solução, mas você detectou algum problema com o "Tamanho máximo da pilha de chamadas"?
— Mikel

11

A função $ .ajax () retorna um objeto XMLHttpRequest. Armazene isso em uma variável acessível a partir do evento "OnClick" do botão Enviar. Quando um clique de envio é processado, verifique se a variável XMLHttpRequest é:

1) nulo, o que significa que nenhuma solicitação foi enviada ainda

2) que o valor readyState é 4 (carregado). Isso significa que a solicitação foi enviada e retornada com sucesso.

Em qualquer um desses casos, retorne verdadeiro e permita que o envio continue. Caso contrário, retorne false para bloquear o envio e fornecer ao usuário alguma indicação de por que o envio não funcionou. :)


4
Verificar se há nulo para determinar se o objeto de solicitação existe é importante, mas se não for nulo, você realmente deve verificar request.readyState > 0 && request.readyState < 4para determinar uma solicitação 'ativa' porque readyState 0 indica que embora o objeto tenha sido criado, uma solicitação da web não foi iniciada .
— Nathan Taylor,

1

Temos que utilizar o método $ .ajax.abort () para abortar a solicitação se ela estiver ativa. Este objeto de promessa usa a propriedade readyState para verificar se a solicitação está ativa ou não.

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 () {

            }
        });
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.