Używając jQuery, jak mogę anulować / przerwać żądanie Ajax , z którego jeszcze nie otrzymałem odpowiedzi?
javascript
jquery
ajax
lukewm
źródło
źródło
$.ajaxStop
?ajaxStop
wykrywa tylko, gdy wszystkie żądania AJAX są kompletne, nie zatrzymuje żądania. Z mojego doświadczenia wynika, że używasz go tak:$(document).ajaxStop(function(){alert("All done")})
. Korzystanie.abort()
jest najlepszą opcją.Odpowiedzi:
Większość metod Ajax jQuery zwraca obiekt XMLHttpRequest (lub równoważny), więc możesz po prostu użyć
abort()
.Zobacz dokumentację:
AKTUALIZACJA: Od jQuery 1.5 zwracany obiekt jest opakowaniem dla natywnego obiektu XMLHttpRequest o nazwie jqXHR. Ten obiekt wydaje się ujawniać wszystkie natywne właściwości i metody, więc powyższy przykład nadal działa. Zobacz Obiekt jqXHR (dokumentacja API jQuery).
AKTUALIZACJA 2: Od jQuery 3 metoda ajax zwraca teraz obietnicę z dodatkowymi metodami (jak przerwanie), więc powyższy kod nadal działa, chociaż zwracany obiekt już nie jest
xhr
. Zobacz blog 3.0 tutaj .AKTUALIZACJA 3 :
xhr.abort()
nadal działa na jQuery 3.x. Nie zakładaj, że aktualizacja 2 jest poprawna. Więcej informacji o repozytorium jQuery Github .źródło
abort
nie zamyka ustanowionego połączenia z serwerem, więcsuccess
nadal będzie wywoływane. Jest to bardzo problematyczne w przypadku implementacji komety z długim odpytywaniem..abort()
nadal działa dla mnie w jQuery 3.2.1. Ten komentarz w powiązanym numerze github autorstwa członka zespołu podstawowego jQuery wydaje się sugerować, że ta odpowiedź jest niepoprawna i.abort()
nie została usunięta.Nie można odwołać żądania, ale można ustawić wartość limitu czasu, po której odpowiedź zostanie zignorowana. Zobacz tę stronę, aby zapoznać się z opcjami AJAX jquery. Uważam, że Twoje żądanie oddzwonienia zostanie wywołane, jeśli limit czasu zostanie przekroczony. Istnieje już domyślny limit czasu dla każdego żądania AJAX.
Można również użyć abort () metody na obiekcie żądania, ale jednocześnie spowoduje to klient przestać słuchać do imprezy, to
możeprawdopodobnie nie będzie zatrzymać serwer z jej przetwarzanie.źródło
Jest to żądanie asynchroniczne , co oznacza, że po wysłaniu zostaje wysłane.
W przypadku, gdy serwer rozpoczyna bardzo kosztowną operację z powodu żądania AJAX, najlepiej jest otworzyć serwer, aby nasłuchiwać żądań anulowania, i wysłać osobne żądanie AJAX, powiadamiając serwer o zaprzestaniu tego, co robi.
W przeciwnym razie po prostu zignoruj odpowiedź AJAX.
źródło
Zapisz wywołania wykonane w tablicy, a następnie wywołaj xhr.abort () na każdym z nich.
OGROMNY PRZESTROGA: Możesz przerwać żądanie, ale to tylko strona klienta. Strona serwera może nadal przetwarzać żądanie. Jeśli używasz czegoś takiego jak PHP lub ASP z danymi sesji, dane sesji są blokowane do czasu zakończenia aukcji ajax. Tak więc, aby umożliwić użytkownikowi kontynuowanie przeglądania witryny, musisz wywołać session_write_close (). Spowoduje to zapisanie sesji i odblokowanie, dzięki czemu inne strony oczekujące na kontynuację będą kontynuowane. Bez tego kilka stron może czekać na usunięcie blokady.
źródło
Żądania AJAX mogą nie zostać ukończone w kolejności, w jakiej zostały uruchomione. Zamiast przerywać, możesz zignorować wszystkie odpowiedzi AJAX, z wyjątkiem ostatniej:
Szorstki zarys kodu:
Demo na jsFiddle
źródło
Musieliśmy tylko obejść ten problem i przetestować trzy różne podejścia.
W naszym przypadku postanowiliśmy zastosować podejście nr 3, ponieważ powoduje ono mniejsze obciążenie serwera. Ale nie jestem w 100% pewien, czy jeśli jQuery gwarantuje wywołanie metody .complete (), może to spowodować sytuację zakleszczenia. W naszych testach nie mogliśmy odtworzyć takiej sytuacji.
źródło
Zawsze najlepszą praktyką jest zrobienie czegoś takiego.
O wiele lepiej jest jednak sprawdzić instrukcję if, aby sprawdzić, czy żądanie ajax jest puste, czy nie.
źródło
Po prostu zadzwoń do xhr. abort (), czy jest to obiekt ajax jquery, czy natywny obiekt XMLHTTPRequest.
przykład:
źródło
Robiłem rozwiązanie do wyszukiwania na żywo i potrzebowałem anulować oczekujące żądania, które mogły potrwać dłużej niż ostatnie / najbardziej aktualne żądanie.
W moim przypadku użyłem czegoś takiego:
źródło
Jak zauważyło wiele osób w wątku, tylko dlatego, że żądanie zostało przerwane po stronie klienta, serwer nadal będzie je przetwarzał. Powoduje to niepotrzebne obciążenie serwera, ponieważ wykonuje pracę, której przestaliśmy słuchać w interfejsie.
Problem, który próbowałem rozwiązać (do którego mogą się również napotkać inni), polega na tym, że kiedy użytkownik wpisał informacje w polu wejściowym, chciałem wystosować prośbę o działanie typu Google Instant.
Aby uniknąć wystrzeliwania niepotrzebnych próśb i zachować szybkość interfejsu, wykonałem następujące czynności:
Spowoduje to zasadniczo wysłanie jednego żądania co 150 ms (zmienną, którą można dostosować do własnych potrzeb). Jeżeli masz problemy ze zrozumieniem tego, co dokładnie dzieje się tutaj, zalogować
xhrCount
ixhrQueue
do konsoli tuż przed jeśli bloku.źródło
Wystarczy użyć ajax.abort (), na przykład możesz przerwać wszelkie oczekujące żądania ajax przed wysłaniem kolejnego takiego
źródło
Za pomocą tego możesz przerwać dowolne ciągłe wywołanie ajax
źródło
nie ma niezawodnego sposobu, aby to zrobić, a ja nawet nie spróbowałbym tego, gdy żądanie jest w ruchu; tylko sposób racjonalnie reagować jest zignorować odpowiedź.
w większości przypadków może się to zdarzyć w sytuacjach takich jak: użytkownik zbyt często klika przycisk uruchamiający wiele kolejnych XHR, tutaj masz wiele opcji, albo blokuj przycisk, aż XHR zostanie zwrócony, albo nawet nie uruchamiaj nowego XHR, podczas gdy inny uruchamia podpowiedź użytkownik odchyli się do tyłu - lub odrzuci każdą oczekującą odpowiedź XHR oprócz ostatniej.
źródło
Poniższy kod pokazuje inicjowanie i przerywanie żądania Ajax:
źródło
Miałem problem z odpytywaniem i po zamknięciu strony ankieta była kontynuowana, więc z mojej przyczyny użytkownik przegapiłby aktualizację, ponieważ wartość mysql była ustawiana na następne 50 sekund po zamknięciu strony, mimo że zabiłem żądanie ajax, ja zastanawiałem się, używając $ _SESSION do ustawienia zmiennej var nie aktualizuje się w ankiecie, dopóki się nie skończy i nie rozpocznie się nowa, więc to, co zrobiłem, ustawiło wartość w mojej bazie danych na 0 = offpage, podczas gdy ja odpytywanie Odpytuję ten wiersz i zwracam false; gdy jest 0, ponieważ zapytanie w sondowaniu dostarczy ci oczywiście bieżące wartości ...
Mam nadzieję, że to pomogło
źródło
Jeśli
xhr.abort();
spowoduje to ponowne załadowanie strony,Następnie możesz ustawić
onreadystatechange
przed przerwaniem, aby zapobiec:źródło
Udostępniłem demo, które pokazuje, jak anulować żądanie AJAX - jeśli dane nie zostaną zwrócone z serwera w określonym czasie oczekiwania.
HTML:
KOD JS:
źródło
$.ajax
zapewniatimeout
opcję, więc nie musisz pisać własnej. Po prostu użyj..., data: {...}, timeout: waitTime,...
.