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
user1853871 12 sierpień 2014, 19:59

2 odpowiedzi

Najlepsza odpowiedź

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ć:

  1. Wstępne sprawdzenie Dokument Gotowy + Zastosuj setInterval za pomocą 1 minuty (zapisz wartość zwracaną w zmiennej)

  2. 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

2
Daniel W. 12 sierpień 2014, 16:04

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);
        }
    }
);
5
Greg Burghardt 13 sierpień 2014, 13:02