Mam następujący kod, który zadzwoń do usługi internetowej co 5 sekund. Ta usługa internetowa czeka, jeśli na liście jest coś.
setTimeout(function () {
_getListItems();
}, 5000);
Jednak zamiast tego sprawdzać co 5 sekund, chcę sprawdzić go na obciążeniu strony, a następnie co minutę. Jeśli na liście znajduje się coś, zacznij dzwonić do nim co 5 sekund. Czy ktoś może mi z tym pomóc?
2 odpowiedzi
setTimeout
Wykonuje tylko raz po danym przedziale, co masz / oznacza setInterval
.
Wartość powrotu tych metod jest identyfikator. Korzystanie z tego identyfikatora możesz usunąć interwał.
Jak możesz to zrobić:
Wstępne sprawdzenie Dokument Gotowy + Zastosuj
setInterval
za pomocą 1 minuty (zapisz wartość zwracaną w zmiennej)Jeśli funkcja zwana co minutę ma elementy na liście, usuń 1-minutowy interwał, skonfiguruj nowy, który sprawdza co 5 sekund
.
var intervalCall = window.setInterval(function() { }, 60000);
window.clearTimeout(intervalCall);
To jest twoje odniesienie: https://developer.mozilla.org/ EN-US / Docs / Web / API / window.setinterval
Mimo że odpowiedź została już zaakceptowana, opublikuję to od momentu połączenia AJAX i {X0}} dozwolone aplikacją, na której pracowałam, aby zdjąć balancerkę ładunkową i pukać wszystkie strony internetowe w trybie offline.
Najpierw omówić różnice między setInterval
i setTimeout
w odniesieniu do odpytywania AJAX.
Zalety przy użyciu setInterval
- Łatwy sposób na wykonanie funkcji i pożarowania żądania Ajax na bicie serca
- Kod jest łatwy do zrozumienia
- Żądania AJAX są wysyłane co X Milisekund bez konieczności uwzględniania na razie żądanie przyjmuje
wady przy użyciu setInterval
- (A to jest wielki), następny wniosek nie czeka na zakończenie bieżącej prośby przed wysłaniem. Gdy systemy zaczynają uruchamiać powolną stronę serwera, te żądania AJAX mogą gromadzić się. Na przykład wysyłasz żądanie co 5 sekund, ale serwer na serwer zajmuje 10 sekund. W ciągu jednej minuty pojedynczy użytkownik może włączyć 12 prośbę do serwera, który nie został jeszcze zwrócony do klienta. Teraz pomnóż przez liczbę współbieżnych użytkowników, a liczba ta szybko się zwiększa. Dziesięciu użytkowników oznacza 120 żądań w kolejce. Sto użytkowników = 1200 wniosków w kolejce w jednej chwili. Pracowałem w miejscu, w którym zrobiliśmy równowagę obciążenia. Musieli dosłownie wyciągnąć wtyczkę, ponieważ przycisk zasilania nawet nie działał. Nie żyje. W. The. Rozcieńczać.
- Błędy uwierzytelniające są trudniejsze w obsłudze, jeśli czasy sesji użytkownika, ponieważ musisz pamiętać, aby usunąć interwał, jeśli serwer zwraca 401 nieautoryzowanej odpowiedzi
Zalety przy użyciu setTimeout
- (A to jest duży) nowe żądania nie są wysyłane przed przetworzeniem bieżącego żądania. To ogranicza katastrofę, którą wyjaśniłem powyżej.
- Błędy uwierzytelniania są łatwiejsze w obsłudze, ponieważ nowe żądania nie są wydawane, gdy odpowiedź Non 200 OK jest odbierana z serwera
wady przy użyciu setTimeout
- Twój kod jest trochę bardziej złożony, ponieważ musisz ponownie uruchomić limit czasu po udanym połączeniu AJAX
- Okres między wnioskami różni się, ponieważ przedział jest w rzeczywistości:
timeout + AJAX request time + response processing time
, więc limit czasu 5000 milisekund może dać przedział około 5500 milisekund, gdy po uwzględnieniu przez czas potrzebuje żądania Ajax, aby wrócić do przeglądarki, i dla przeglądarki przetworzenie odpowiedzi. Możesz wyjaśnić to, śledząc żądanie ajax i czas przetwarzania i odejmowanie tego ze standardowego okresu limitu czasu.
Zasadniczo, konsekwencja przy użyciu setTimeout
jest zwiększona złożoność kodu, ale zmniejszona ryzyko DDOS-ING własnego systemu, gdy po stronie serwera działa wolno.
Przykład użycia setTimeout
function poll(url, method, period, beforeRequest, onSuccess, onError) {
var xhr = new XMLHttpRequest(),
onReadyStateChange= function() {
if (this.readyState === 4) {
if (this.status === 200 || this.status === 201) {
onSuccess(xhr);
setTimeout(sendRequest, period);
}
else if (this.status > 399) {
// Allow error handling code to retry the operation
onError(xhr, sendRequest, period);
}
}
},
sendRequest = function() {
var data = beforeRequest(xhr) || null;
xhr.open(method, url, true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.send(data);
};
xhr.onreadystatechange = onReadyStateChange;
setTimeout(sendRequest, period);
}
I użyć funkcji:
poll("/messages", "POST", 10000,
function beforeRequest(xhr) {
return "?user_id=123";
},
function onSuccess(xhr) {
var data = JSON.parse(xhr.responseText);
// show messages...
},
function onError(xhr, sendRequest, period) {
if (xhr.status === 401) {
// show dialog to log in user
}
else {
// retry the operation
setTimeout(sendRequest, period + 10000);
}
}
);