Biorąc pod uwagę żądanie Ajax w AngularJS
$http.get("/backend/").success(callback);
jaki jest najskuteczniejszy sposób anulowania tego żądania, jeśli uruchomione zostanie kolejne żądanie (ten sam backend, różne parametry na przykład).
Biorąc pod uwagę żądanie Ajax w AngularJS
$http.get("/backend/").success(callback);
jaki jest najskuteczniejszy sposób anulowania tego żądania, jeśli uruchomione zostanie kolejne żądanie (ten sam backend, różne parametry na przykład).
promise.abort()
stackoverflow.com/a/50415480/984780Odpowiedzi:
Ta funkcja została dodana do wersji 1.1.5 za pomocą parametru limitu czasu:
źródło
setTimeout
funkcji JavaScript lub$timeout
usługi Angular .Anulowanie Angular $ http Ajax z właściwością timeout nie działa w Angular 1.3.15. Dla tych, którzy nie mogą się doczekać, aby to naprawić, udostępniam rozwiązanie jQuery Ajax opakowane w Angular.
Rozwiązanie obejmuje dwie usługi:
Oto usługa PendingRequestsService:
Usługa HttpService:
Później w usłudze, gdy ładujesz dane, użyjesz HttpService zamiast $ http:
Później w kodzie chcesz załadować dane:
źródło
Anulowanie żądań wydanych za pomocą
$http
nie jest obsługiwane w bieżącej wersji AngularJS. Zostało otwarte żądanie ściągnięcia, aby dodać tę możliwość, ale ten PR nie został jeszcze sprawdzony, więc nie jest jasne, czy uda mu się przekształcić w rdzeń AngularJS.źródło
Jeśli chcesz anulować oczekujące żądania na stateChangeStart za pomocą interfejsu użytkownika, możesz użyć czegoś takiego:
// czynny
// w konfiguracji UIrouter
źródło
request.timeout
jest obecna?Z jakiegoś powodu config.timeout nie działa dla mnie. Użyłem tego podejścia:
I cancelRequest.resolve (), aby anulować. W rzeczywistości nie anuluje to żądania, ale przynajmniej nie otrzymasz niepotrzebnej odpowiedzi.
Mam nadzieję że to pomoże.
źródło
{ cancelPromise, httpPromise }
?Zwiększa to akceptowaną odpowiedź, dekorując usługę $ http za pomocą metody przerywania w następujący sposób ...
CO DZIAŁA TEN KOD?
Aby anulować żądanie, należy ustawić limit czasu „obietnicy”. Jeśli dla żądania HTTP nie ustawiono limitu czasu, kod dodaje limit czasu „obiecania”. (Jeśli limit czasu jest już ustawiony, nic się nie zmienia).
Aby jednak spełnić obietnicę, potrzebujemy poradzić sobie z „odroczonym”. W ten sposób korzystamy z mapy, aby później odzyskać „odroczone”. Kiedy wywołujemy metodę przerwania, „odroczony” jest pobierany z mapy, a następnie wywołujemy metodę resolve, aby anulować żądanie http.
Mam nadzieję, że to komuś pomoże.
OGRANICZENIA
Obecnie działa to tylko dla $ http.get, ale możesz dodać kod dla $ http.post i tak dalej
JAK UŻYWAĆ ...
Następnie możesz go użyć na przykład przy zmianie stanu, w następujący sposób ...
źródło
tutaj jest wersja, która obsługuje wiele żądań, sprawdza również status anulowania w wywołaniu zwrotnym, aby ukryć błędy w bloku błędów. (w maszynopisie)
poziom kontrolera:
w moim http:
metody pomocnicze
teraz patrząc na kartę sieci, widzę, że działa pięknie. zadzwoniłem do tej metody 4 razy i przeszła tylko ostatnia.
źródło
Możesz dodać niestandardową funkcję do
$http
usługi za pomocą „dekoratora”, który dodałbyabort()
funkcję do twoich obietnic.Oto działający kod:
Ten kod używa funkcji dekoratora angularjs w celu dodania
with_abort()
funkcji do$http
usługi.with_abort()
używa$http
opcji limitu czasu, która pozwala przerwać żądanie HTTP.Zwrócona obietnica jest modyfikowana w celu włączenia
abort()
funkcji. Posiada również kod, aby upewnić się, żeabort()
działa, nawet jeśli łączysz obietnice.Oto przykład, w jaki sposób chcesz go użyć:
Domyślnie po wywołaniu
abort()
żądanie zostaje anulowane i żaden z programów obsługi obietnic nie jest uruchamiany.Jeśli chcesz, aby procedury obsługi błędów były nazywane pass true
abort(true)
.W module obsługi błędów możesz sprawdzić, czy „błąd” był spowodowany „przerwaniem”, sprawdzając
xhrStatus
właściwość. Oto przykład:źródło