Dada uma solicitação do Ajax no AngularJS
$http.get("/backend/").success(callback);
qual é a maneira mais eficaz de cancelar essa solicitação se outra solicitação for lançada (mesmo back-end, parâmetros diferentes, por exemplo).
Dada uma solicitação do Ajax no AngularJS
$http.get("/backend/").success(callback);
qual é a maneira mais eficaz de cancelar essa solicitação se outra solicitação for lançada (mesmo back-end, parâmetros diferentes, por exemplo).
promise.abort()
stackoverflow.com/a/50415480/984780Respostas:
Este recurso foi adicionado à versão 1.1.5 por meio de um parâmetro de tempo limite:
fonte
setTimeout
função nativa do JavaScript ou o$timeout
serviço da Angular .O cancelamento do Angular $ http Ajax com a propriedade timeout não funciona no Angular 1.3.15. Para aqueles que não podem esperar que isso seja corrigido, estou compartilhando uma solução jQuery Ajax envolvida em Angular.
A solução envolve dois serviços:
Aqui está o serviço PendingRequestsService:
O serviço HttpService:
Posteriormente em seu serviço, ao carregar dados, você usaria o HttpService em vez de $ http:
Posteriormente no seu código, você gostaria de carregar os dados:
fonte
O cancelamento de solicitações emitidas
$http
não é suportado na versão atual do AngularJS. Há uma solicitação de recebimento aberta para adicionar esse recurso, mas esse PR ainda não foi revisado, portanto, não está claro se ele fará parte do núcleo do AngularJS.fonte
Se você deseja cancelar solicitações pendentes no stateChangeStart com o ui-router, você pode usar algo como isto:
// em serviço
// na configuração do UIrouter
fonte
request.timeout
está presente?Por alguma razão, config.timeout não funciona para mim. Eu usei essa abordagem:
E cancelRequest.resolve () para cancelar. Na verdade, ele não cancela uma solicitação, mas você não recebe respostas desnecessárias pelo menos.
Espero que isto ajude.
fonte
{ cancelPromise, httpPromise }
?Isso aprimora a resposta aceita decorando o serviço $ http com um método de cancelamento da seguinte maneira ...
O QUE ESTE CÓDIGO ESTÁ FAZENDO?
Para cancelar uma solicitação, um tempo limite de "promessa" deve ser definido. Se nenhum tempo limite for definido na solicitação HTTP, o código adicionará um tempo limite de "promessa". (Se um tempo limite já estiver definido, nada será alterado).
No entanto, para resolver a promessa, precisamos lidar com o "adiado". Assim, usamos um mapa para recuperar o "adiado" posteriormente. Quando chamamos o método abort, o "adiado" é recuperado do mapa e, em seguida, chamamos o método resolve para cancelar a solicitação http.
Espero que isso ajude alguém.
LIMITAÇÕES
Atualmente, isso funciona apenas para $ http.get, mas você pode adicionar código para $ http.post e assim por diante
COMO USAR ...
Você pode usá-lo, por exemplo, na mudança de estado, da seguinte maneira ...
fonte
Aqui está uma versão que lida com várias solicitações, também verifica o status cancelado no retorno de chamada para suprimir erros no bloco de erros. (em texto datilografado)
nível do controlador:
no meu http get:
métodos auxiliares
Agora, olhando para a guia rede, vejo que funciona muito bem. chamei o método 4 vezes e apenas o último passou.
fonte
Você pode adicionar uma função personalizada ao
$http
serviço usando um "decorador" que adiciona aabort()
função às suas promessas.Aqui está um código de trabalho:
Este código usa a funcionalidade do decorador do angularjs para adicionar uma
with_abort()
função ao$http
serviço.with_abort()
usa a$http
opção de tempo limite que permite anular uma solicitação http.A promessa retornada é modificada para incluir uma
abort()
função. Ele também possui código para garantir queabort()
funcione, mesmo que você prometa em cadeia.Aqui está um exemplo de como você o usaria:
Por padrão, quando você chama,
abort()
a solicitação é cancelada e nenhum dos manipuladores de promessa é executado.Se você deseja que seus manipuladores de erro sejam chamados, passe para true
abort(true)
.No manipulador de erros, você pode verificar se o "erro" ocorreu devido a um "cancelamento", verificando a
xhrStatus
propriedade Aqui está um exemplo:fonte