Mam żądanie AJAX, które będzie wysyłane co 5 sekund. Ale problem występuje przed żądaniem AJAX, jeśli poprzednie żądanie nie zostało zakończone, muszę przerwać to żądanie i złożyć nowe żądanie.
Mój kod jest mniej więcej taki, jak rozwiązać ten problem?
$(document).ready(
var fn = function(){
$.ajax({
url: 'ajax/progress.ftl',
success: function(data) {
//do something
}
});
};
var interval = setInterval(fn, 500);
);
Odpowiedzi:
Metoda jquery ajax zwraca obiekt XMLHttpRequest . Możesz użyć tego obiektu, aby anulować żądanie.
XMLHttpRequest ma metodę przerwania , która anuluje żądanie, ale jeśli żądanie zostało już wysłane do serwera, serwer przetworzy żądanie, nawet jeśli przerwiemy żądanie, ale klient nie będzie czekał / obsłużył odpowiedzi.
Obiekt xhr zawiera również stan readyState, który zawiera stan żądania (UNSENT-0, OPENED-1, HEADERS_RECEIVED-2, LOADING-3 i DONE-4). możemy to wykorzystać do sprawdzenia, czy poprzednie żądanie zostało zrealizowane.
źródło
readystate
powyżej ireadyState
poniżej, postaćs
jest pisana wielkimi literami w jQuery 1.5if (xhr) xhr.abort();
będzie dobrze działać.readystate
w swojej dokumentacji. Zawsze była pisana wielkimi literami,readyState
a jquery (przed 1.5 lub później) poprawnie pasowało do specyfikacji w3.Kiedy wysyłasz żądanie do serwera, sprawdź, czy najpierw postęp nie jest zerowy (lub nie pobiera tych danych). Jeśli pobiera dane, przerwij poprzednie żądanie i zainicjuj nowe.
źródło
Wiem, że to może być trochę za późno, ale mam podobne problemy, gdy wywołanie metody przerwania naprawdę nie przerwało żądania. zamiast tego przeglądarka wciąż czekała na odpowiedź, której nigdy nie używa. ten kod rozwiązał ten problem.
źródło
Dlaczego warto przerwać prośbę?
Jeśli każde żądanie zajmie więcej niż pięć sekund, co się stanie?
Nie należy przerywać żądania, jeśli parametr przekazywany z żądaniem nie zmienia się. np .: - żądanie dotyczy odzyskania danych powiadomienia. W takich sytuacjach Przyjemne podejście polega na tym, że ustawia nowe żądanie dopiero po wypełnieniu poprzedniego żądania Ajax.
źródło
Możesz użyć jquery-validate.js. Poniżej znajduje się fragment kodu z pliku jquery-validate.js.
Musisz tylko ustawić tryb parametrów , aby przerwał się, gdy tworzysz żądanie ajax.
Ref: https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.js
źródło
jQuery: Użyj tego jako punktu wyjścia - jako inspiracji. Rozwiązałem to w ten sposób: (to nie jest idealne rozwiązanie, po prostu przerywa ostatnią instancję i jest kodem WIP)
źródło
Utwórz funkcję, aby wywołać interfejs API. W ramach tej funkcji definiujemy żądanie
callApiRequest = $.get(...
- chociaż jest to definicja zmiennej, żądanie jest wywoływane natychmiast, ale teraz mamy zdefiniowane żądanie jako zmienną. Przed wywołaniem żądania sprawdzamy, czy nasza zmienna jest zdefiniowana,typeof(callApiRequest) != 'undefined'
a także czy jest w tokusuggestCategoryRequest.state() == 'pending'
- jeśli oba są prawdziwe, to.abort()
żądanie, które zapobiegnie uruchomieniu wywołania zwrotnego powodzenia.Twój serwer / API może nie obsługiwać przerywania żądania (co jeśli API wykonał już jakiś kod?), Ale wywołanie zwrotne javascript nie zostanie uruchomione. Jest to przydatne, gdy na przykład podajesz sugestie wejściowe użytkownikowi, takie jak dane hashtags.
Możesz dodatkowo rozszerzyć tę funkcję, dodając definicję wywołania zwrotnego błędu - co powinno się stać, jeśli żądanie zostanie przerwane.
Typowym przypadkiem użycia tego fragmentu kodu byłoby wprowadzanie tekstu, który jest uruchamiany w
keypress
przypadku zdarzenia. Możesz użyć limitu czasu, aby zapobiec wysyłaniu (niektórych) żądań, które będziesz musiał anulować.abort()
.źródło
Powinieneś również sprawdzić dla readyState 0. Ponieważ kiedy używasz xhr.abort () ta funkcja ustawia readyState na 0 w tym obiekcie, a twoje sprawdzenie jeśli zawsze będzie prawdziwe - readyState! = 4
źródło