Dada una solicitud de Ajax en AngularJS
$http.get("/backend/").success(callback);
cuál es la forma más efectiva de cancelar esa solicitud si se lanza otra solicitud (mismo backend, diferentes parámetros, por ejemplo).
Dada una solicitud de Ajax en AngularJS
$http.get("/backend/").success(callback);
cuál es la forma más efectiva de cancelar esa solicitud si se lanza otra solicitud (mismo backend, diferentes parámetros, por ejemplo).
promise.abort()
stackoverflow.com/a/50415480/984780Respuestas:
Esta característica se agregó a la versión 1.1.5 a través de un parámetro de tiempo de espera:
fuente
setTimeout
función nativa de JavaScript o con el$timeout
servicio de Angular .Cancelar Angular $ http Ajax con la propiedad de tiempo de espera no funciona en Angular 1.3.15. Para aquellos que no pueden esperar a que esto se solucione, estoy compartiendo una solución jQuery Ajax envuelta en Angular.
La solución involucra dos servicios:
Aquí va el servicio PendingRequestsService:
El servicio HttpService:
Más adelante en su servicio, cuando esté cargando datos, usaría el HttpService en lugar de $ http:
Más adelante en su código le gustaría cargar los datos:
fuente
La cancelación de solicitudes emitidas con
$http
no es compatible con la versión actual de AngularJS. Hay una solicitud de extracción abierta para agregar esta capacidad, pero este PR aún no se revisó, por lo que no está claro si va a llegar al núcleo de AngularJS.fuente
Si desea cancelar las solicitudes pendientes en stateChangeStart con ui-router, puede usar algo como esto:
// en servicio
// en la configuración de UIrouter
fuente
request.timeout
está presente?Por alguna razón config.timeout no funciona para mí. Usé este enfoque:
Y cancelRequest.resolve () para cancelar. En realidad, no cancela una solicitud, pero al menos no recibe respuestas innecesarias.
Espero que esto ayude.
fuente
{ cancelPromise, httpPromise }
?Esto mejora la respuesta aceptada al decorar el servicio $ http con un método de cancelación de la siguiente manera ...
¿Qué está haciendo este código?
Para cancelar una solicitud, se debe establecer un tiempo de espera de "promesa". Si no se establece un tiempo de espera en la solicitud HTTP, el código agrega un tiempo de espera "prometedor". (Si ya se ha establecido un tiempo de espera, no se cambia nada).
Sin embargo, para resolver la promesa, necesitamos manejar el "diferido". Por lo tanto, utilizamos un mapa para poder recuperar el "diferido" más adelante. Cuando llamamos al método abortar, el "diferido" se recupera del mapa y luego llamamos al método resolver para cancelar la solicitud http.
Espero que esto ayude a alguien.
Limitaciones
Actualmente, esto solo funciona para $ http.get, pero puede agregar código para $ http.post, etc.
CÓMO UTILIZAR ...
Luego puede usarlo, por ejemplo, en el cambio de estado, de la siguiente manera ...
fuente
Aquí hay una versión que maneja múltiples solicitudes, también verifica el estado cancelado en la devolución de llamada para suprimir errores en el bloque de error. (en mecanografiado)
nivel de controlador:
en mi http obtener:
métodos de ayuda
Ahora, mirando la pestaña de red, veo que funciona de forma excelente. Llamé al método 4 veces y solo se realizó el último.
fuente
Puede agregar una función personalizada al
$http
servicio utilizando un "decorador" que agregaría elabort()
función a sus promesas.Aquí hay un código de trabajo:
Este código utiliza la funcionalidad de decorador de angularjs para agregar una
with_abort()
función al$http
servicio.with_abort()
utiliza la$http
opción de tiempo de espera que le permite cancelar una solicitud http.La promesa devuelta se modifica para incluir una
abort()
función. También tiene código para asegurarse de queabort()
funciona incluso si encadena promesas.Aquí hay un ejemplo de cómo lo usarías:
Por defecto, cuando llama,
abort()
la solicitud se cancela y ninguno de los controladores de promesas se ejecuta.Si desea que se llame a sus controladores de errores, pase true a
abort(true)
.En su controlador de errores, puede verificar si el "error" se debió a un "aborto" al verificar la
xhrStatus
propiedad. Aquí hay un ejemplo:fuente