Учитывая запрос Ajax в AngularJS
$http.get("/backend/").success(callback);
Каков наиболее эффективный способ отменить этот запрос, если запущен другой запрос (такой же сервер, например, другие параметры).
Учитывая запрос Ajax в AngularJS
$http.get("/backend/").success(callback);
Каков наиболее эффективный способ отменить этот запрос, если запущен другой запрос (такой же сервер, например, другие параметры).
promise.abort()
stackoverflow.com/a/50415480/984780Ответы:
Эта функция была добавлена в выпуск 1.1.5 с помощью параметра времени ожидания:
источник
setTimeout
функции JavaScript, либо с помощью$timeout
службы Angular .Отмена Angular $ http Ajax с помощью свойства timeout не работает в Angular 1.3.15. Для тех, кто не может дождаться, когда это будет исправлено, я поделюсь решением jQuery Ajax, обернутым в Angular.
Решение включает в себя две услуги:
Здесь идет служба PendingRequestsService:
Сервис HttpService:
Позже в вашем сервисе при загрузке данных вы будете использовать HttpService вместо $ http:
Позже в вашем коде вы хотели бы загрузить данные:
источник
Отмена запросов, выданных с помощью
$http
, не поддерживается в текущей версии AngularJS. Существует открытый запрос на добавление этой возможности, но этот PR еще не рассматривался, поэтому неясно, собирается ли он превратиться в ядро AngularJS.источник
Если вы хотите отменить отложенные запросы на stateChangeStart с помощью ui-router, вы можете использовать что-то вроде этого:
// в сервисе
// в конфигурации UIrouter
источник
request.timeout
присутствует ли?По какой-то причине config.timeout у меня не работает. Я использовал этот подход:
И отменитьRequest.resolve (), чтобы отменить. На самом деле это не отменяет запрос, но вы, по крайней мере, не получаете ненужный ответ.
Надеюсь это поможет.
источник
{ cancelPromise, httpPromise }
?Это расширяет принятый ответ, украшая службу $ http методом прерывания следующим образом ...
ЧТО ЭТО ДЕЛАЕТ КОДЕКС?
Для отмены запроса должен быть установлен тайм-аут. Если для HTTP-запроса тайм-аут не установлен, то код добавляет тайм-аут «обещания». (Если тайм-аут уже установлен, то ничего не меняется).
Тем не менее, чтобы выполнить обещание, нам нужен дескриптор «отложенного». Таким образом, мы используем карту, чтобы потом получить «отложенный». Когда мы вызываем метод abort, с карты извлекается «deferred», а затем мы вызываем метод resolve для отмены http-запроса.
Надеюсь, это кому-нибудь поможет.
ОГРАНИЧЕНИЯ
В настоящее время это работает только для $ http.get, но вы можете добавить код для $ http.post и т. Д.
КАК ПОЛЬЗОВАТЬСЯ ...
Затем вы можете использовать его, например, при изменении состояния следующим образом ...
источник
Вот версия, которая обрабатывает несколько запросов, а также проверяет состояние отмены в обратном вызове для подавления ошибок в блоке ошибок. (в машинописном тексте)
Уровень контроллера:
в моем http получить:
вспомогательные методы
теперь, глядя на вкладку сети, я вижу, что она работает превосходно. я вызвал метод 4 раза, и только последний прошел.
источник
Вы можете добавить пользовательскую функцию к
$http
сервису, используя «декоратор», который добавитabort()
функцию к вашим обещаниям.Вот некоторый рабочий код:
Этот код использует функциональность декоратора angularjs для добавления
with_abort()
функции в$http
сервис.with_abort()
использует$http
опцию тайм-аута, которая позволяет прервать HTTP-запрос.Возвращенное обещание модифицируется, чтобы включить
abort()
функцию. Он также имеет код, чтобы убедиться, чтоabort()
работает, даже если вы цепочки обещаний.Вот пример того, как вы бы это использовали:
По умолчанию при вызове
abort()
запрос отменяется, и ни один из обработчиков обещаний не запускается.Если вы хотите, чтобы ваши обработчики ошибок вызывались, передайте true
abort(true)
.В вашем обработчике ошибок вы можете проверить, была ли «ошибка» вызвана «отменой», проверив
xhrStatus
свойство. Вот пример:источник