Abortar pedidos Ajax usando jQuery

Usando jQuery, como posso cancelar/abortar um pedido Ajax do qual ainda não recebi a resposta?

Solução

A maioria dos métodos jQuery Ajax retornam um objeto XMLHttpRequest (ou o equivalente), então você pode simplesmente utilizar abort().

Veja a documentação:

  • abortar Método (MSDN). Cancela a requisição HTTP atual.
  • abort() (MDN). Se a requisição já tiver sido enviada, este método abortará a requisição.
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()

UPDATE: A partir de jQuery 1.5 o objeto retornado é um wrapper para o objeto nativo XMLHttpRequest chamado jqXHR. Este objeto parece expor todas as propriedades e métodos nativos para que o exemplo acima ainda funcione. Veja O objeto jqXHR (documentação da API jQuery).

UPDATE 2: A partir de jQuery 3, o método ajax agora retorna uma promessa com métodos extras (como abortar), então o código acima ainda funciona, embora o objeto sendo retornado não seja mais um xhr. Veja o blog 3.0 aqui.

**UPDATE 3**: xhr.abort() ainda funciona em jQuery 3.x. Não assuma que a actualização 2* está correta. Mais informações sobre o repositório jQuery Github.

Comentários (15)

Você não pode se lembrar do pedido, mas pode definir um valor de timeout após o qual a resposta será ignorada. Veja esta página para opções de jquery AJAX. Acredito que a sua chamada de retorno de erro será chamada se o período de timeout for excedido. Já existe um timeout padrão em cada solicitação AJAX.

Você também pode usar o método abort() no objeto de requisição mas, enquanto isso fará com que o cliente pare de ouvir o evento, ele may provavelmente não irá parar o servidor de processá-lo.

Comentários (0)

É um pedido assíncrono, ou seja, uma vez que é enviado, está lá fora.

Caso seu servidor esteja iniciando uma operação muito cara devido ao pedido AJAX, o melhor que você pode fazer é abrir seu servidor para ouvir pedidos de cancelamento, e enviar um pedido AJAX separado notificando o servidor para parar o que quer que ele esteja fazendo.

Caso contrário, simplesmente ignore a resposta do AJAX.

Comentários (8)