Usando o jQuery, como posso cancelar / abortar uma solicitação do Ajax da qual ainda não recebi a resposta?
javascript
jquery
ajax
morno
fonte
fonte
$.ajaxStop
?ajaxStop
só detecta quando todas as solicitações AJAX são concluídas, não para uma solicitação. Na minha experiência, você iria utilizá-lo como este:$(document).ajaxStop(function(){alert("All done")})
. Usar.abort()
é a melhor opção.Respostas:
A maioria dos métodos jQuery Ajax retorna um objeto XMLHttpRequest (ou equivalente), para que você possa usar
abort()
.Veja a documentação:
ATUALIZAÇÃO: A partir do jQuery 1.5, o objeto retornado é um wrapper para o objeto XMLHttpRequest nativo chamado jqXHR. Este objeto parece expor todas as propriedades e métodos nativos para que o exemplo acima ainda funcione. Consulte O objeto jqXHR (documentação da API jQuery).
ATUALIZAÇÃO 2: A partir do jQuery 3, o método ajax agora retorna uma promessa com métodos extras (como abortar), portanto o código acima ainda funciona, embora o objeto que está sendo retornado não
xhr
seja mais. Veja o blog 3.0 aqui .ATUALIZAÇÃO 3 :
xhr.abort()
ainda funciona no jQuery 3.x. Não assuma que a atualização 2 esteja correta. Mais informações sobre o repositório jQuery Github .fonte
abort
não fecha uma conexão estabelecida com o servidor, porsuccess
isso ainda será chamado. Isso é muito problemático para implementações do Comet com pesquisas longas..abort()
ainda funciona para mim no jQuery 3.2.1. Esse comentário em um problema relacionado ao github por um membro da equipe principal do jQuery parece sugerir que esta resposta está incorreta e que.abort()
não foi removida.Você não pode recuperar a solicitação, mas pode definir um valor de tempo limite após o qual a resposta será ignorada. Veja esta página para opções de jquery AJAX. Acredito que seu retorno de chamada de erro será chamado se o período de tempo limite for excedido. Já existe um tempo limite padrão em cada solicitação AJAX.
Você também pode usar o abort () método no objeto do pedido, mas, ao mesmo tempo que fará com que o cliente para parar de ouvir para o evento, ele
podeprovavelmente não vai parar o servidor de processá-lo.fonte
É uma solicitação assíncrona , ou seja, uma vez enviada, ela está lá fora.
Caso seu servidor esteja iniciando uma operação muito cara devido à solicitação AJAX, o melhor que você pode fazer é abrir o servidor para ouvir solicitações de cancelamento e enviar uma solicitação AJAX separada notificando o servidor para parar o que está fazendo.
Caso contrário, simplesmente ignore a resposta AJAX.
fonte
Salve as chamadas feitas em uma matriz e chame xhr.abort () em cada uma.
ENORME CAVEAT: Você pode abortar uma solicitação, mas esse é apenas o lado do cliente. O lado do servidor ainda pode estar processando a solicitação. Se você estiver usando algo como PHP ou ASP com dados da sessão, os dados da sessão serão bloqueados até o final do ajax. Portanto, para permitir que o usuário continue navegando no site, é necessário chamar session_write_close (). Isso salva a sessão e a desbloqueia para que outras páginas que aguardam a continuação continuem. Sem isso, várias páginas podem estar aguardando a remoção do bloqueio.
fonte
As solicitações AJAX podem não ser concluídas na ordem em que foram iniciadas. Em vez de abortar, você pode optar por ignorar todas as respostas AJAX, exceto a mais recente:
Esboço aproximado do código:
Demo no jsFiddle
fonte
Nós apenas tivemos que solucionar esse problema e testamos três abordagens diferentes.
No nosso caso, decidimos usar a abordagem nº 3, pois ela produz menos carga para o servidor. Mas não tenho 100% de certeza se o jQuery garantir a chamada do método .complete () -, isso pode produzir uma situação de conflito. Nos nossos testes, não conseguimos reproduzir essa situação.
fonte
É sempre uma prática recomendada fazer algo assim.
Mas é muito melhor se você verificar uma instrução if para verificar se a solicitação ajax é nula ou não.
fonte
Basta ligar para xhr. abort (), seja objeto jquery ajax ou objeto XMLHTTPRequest nativo.
exemplo:
fonte
Eu estava fazendo uma solução de pesquisa ao vivo e precisava cancelar solicitações pendentes que podem levar mais tempo que a solicitação mais recente / mais atual.
No meu caso, usei algo como isto:
fonte
Como muitas pessoas no encadeamento observaram, apenas porque a solicitação foi abortada no lado do cliente, o servidor ainda processará a solicitação. Isso cria uma carga desnecessária no servidor, porque ele está fazendo um trabalho que paramos de ouvir no front-end.
O problema que eu estava tentando resolver (para o qual outras pessoas também se deparam) é que, quando o usuário inseria informações em um campo de entrada, eu queria acionar uma solicitação para uma sensação do tipo Google Instant.
Para evitar disparar solicitações desnecessárias e manter o snappiness do front-end, fiz o seguinte:
Essencialmente, isso enviará uma solicitação a cada 150ms (uma variável que você pode personalizar para suas próprias necessidades). Se você estiver com problemas para entender o que exatamente está acontecendo aqui, faça logon
xhrCount
exhrQueue
no console imediatamente antes do bloco if.fonte
Basta usar ajax.abort (), por exemplo, você pode abortar qualquer solicitação de ajax pendente antes de enviar outra como esta
fonte
Você pode cancelar qualquer chamada ajax contínua usando este
fonte
não há uma maneira confiável de fazer isso, e eu nem tentaria, uma vez que a solicitação estivesse em movimento; a única maneira de reagir razoavelmente é ignorar a resposta.
na maioria dos casos, isso pode acontecer em situações como: um usuário clica com muita freqüência em um botão que aciona muitos XHR consecutivos, aqui você tem muitas opções: bloqueia o botão até o retorno do XHR ou nem aciona um novo XHR enquanto outro está executando dicas o usuário se inclinar para trás - ou descartar qualquer resposta XHR pendente, exceto a recente.
fonte
O código a seguir mostra o início e o cancelamento de uma solicitação do Ajax:
fonte
Eu tive o problema de pesquisar e, uma vez que a página foi fechada, a pesquisa continuou, por isso, na minha causa, um usuário perderia uma atualização, pois um valor mysql estava sendo definido pelos próximos 50 segundos após o fechamento da página, mesmo que eu tenha matado a solicitação ajax, calculado, usar $ _SESSION para definir um var não será atualizado automaticamente na enquete até que termine e inicie um novo, então o que eu fiz foi definir um valor no meu banco de dados como 0 = offpage, enquanto estou sondagem eu consulto essa linha e retorno false; quando for 0, pois a consulta nas pesquisas obterá os valores atuais, obviamente ...
Espero que isso tenha ajudado
fonte
E se
xhr.abort();
causar o recarregamento da página,Em seguida, você pode definir
onreadystatechange
antes do cancelamento para impedir:fonte
Compartilhei uma demonstração que demonstra como cancelar uma solicitação AJAX - se os dados não forem retornados do servidor dentro de um tempo de espera predefinido.
HTML:
CÓDIGO JS:
fonte
$.ajax
fornece umatimeout
opção para que você não precise escrever sua própria. Basta usar..., data: {...}, timeout: waitTime,...
.