Eu tenho uma solicitação AJAX que será feita a cada 5 segundos. Mas o problema está antes da solicitação AJAX, se a solicitação anterior não for concluída, eu tenho que abortar essa solicitação e fazer uma nova solicitação.
Meu código é algo como isto, como resolver esse problema?
$(document).ready(
var fn = function(){
$.ajax({
url: 'ajax/progress.ftl',
success: function(data) {
//do something
}
});
};
var interval = setInterval(fn, 500);
);
Respostas:
O método jquery ajax retorna um objeto XMLHttpRequest . Você pode usar esse objeto para cancelar a solicitação.
O XMLHttpRequest possui um método de cancelamento , que cancela a solicitação, mas se a solicitação já tiver sido enviada ao servidor, o servidor processará a solicitação, mesmo que a solicitação seja cancelada, mas o cliente não esperará / manipulará a resposta.
O objeto xhr também contém um readyState que contém o estado da solicitação (UNSENT-0, OPENED-1, HEADERS_RECEIVED-2, LOADING-3 e DONE-4). podemos usar isso para verificar se a solicitação anterior foi concluída.
fonte
readystate
acima ereadyState
abaixo, o carácters
é maiúscula no jQuery 1,5if (xhr) xhr.abort();
vai funcionar muito bem também.readystate
em maiúsculas em sua documentação. Ele estava sempre em maiúsculasreadyState
e o jquery (antes ou depois da 1.5) correspondia corretamente à especificação w3.Quando você faz uma solicitação a um servidor, verifique se um progresso não é nulo (ou buscando esses dados) primeiro. Se estiver buscando dados, aborte a solicitação anterior e inicie a nova.
fonte
Eu sei que isso pode ser um pouco tarde, mas eu experimentei problemas semelhantes em que chamar o método abort realmente não abortou a solicitação. em vez disso, o navegador ainda estava esperando por uma resposta que ele nunca usa. esse código resolveu esse problema.
fonte
Por que você deve abortar a solicitação?
Se cada solicitação demorar mais de cinco segundos, o que acontecerá?
Você não deve abortar a solicitação se o parâmetro que passa com a solicitação não estiver sendo alterado. por exemplo: - a solicitação é para recuperar os dados da notificação. Nessas situações, a abordagem legal é que defina uma nova solicitação somente após a conclusão da solicitação Ajax anterior.
fonte
Você pode usar o jquery-validate.js. A seguir está o trecho de código de jquery-validate.js.
Para que você só precise definir o modo de parâmetro para abortar quando estiver fazendo uma solicitação ajax.
Ref: https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.js
fonte
jQuery: use isso como ponto de partida - como inspiração. Eu resolvi assim: (essa não é uma solução perfeita, apenas anula a última instância e é o código WIP)
fonte
Crie uma função para chamar sua API. Dentro dessa função, definimos solicitação
callApiRequest = $.get(...
- mesmo que seja uma definição de variável, a solicitação é chamada imediatamente, mas agora temos a solicitação definida como uma variável. Antes que a solicitação seja chamada, verificamos se nossa variável está definidatypeof(callApiRequest) != 'undefined'
e também se está pendentesuggestCategoryRequest.state() == 'pending'
- se as duas forem verdadeiras, é.abort()
a solicitação que impedirá a execução do retorno de chamada com êxito.Seu servidor / API pode não suportar a interrupção da solicitação (e se a API já tiver executado algum código?), Mas o retorno de chamada javascript não será acionado. Isso é útil quando, por exemplo, você está fornecendo sugestões de entrada para um usuário, como entrada de hashtags.
Você pode estender ainda mais essa função adicionando a definição de retorno de chamada de erro - o que deve acontecer se a solicitação for abortada.
Caso de uso comum para esse snippet seria uma entrada de texto que é acionada no
keypress
evento. Você pode usar um tempo limite para impedir o envio de (algumas) solicitações que você precisará cancelar.abort()
.fonte
Você também deve verificar o readyState 0. Porque, quando você usa xhr.abort (), essa função define readyState como 0 neste objeto, e sua verificação if será sempre verdadeira - readyState! = 4
fonte