• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z setInterval

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
379 wizyt
pytanie zadane 5 października 2023 w JavaScript przez Kamil3224 Nowicjusz (210 p.)
edycja 5 października 2023 przez Kamil3224

Witam wszystkich, mam problem za funkcją  timeDate(). zamysł jest taki aby skrypt pobierał dane XML z linku i po godzinie wysłał zaptyanie do XMLa jeszcze raz. Ale na razie jest że skrypt wysłał zapytanie co 1sek. i nie wiem dla czego.   Oto kod: 

var lastUpdateTime = 0; // Inicjalizacja czasu ostatniego pobrania danych

function timeDate() {
    var currentTime = new Date().getTime(); // Pobranie aktualnego czasu w milisekundach
    var timeDiff = currentTime - lastUpdateTime; // Obliczenie różnicy czasu od ostatniego pobrania danych
    
    // Jeśli minęła godzina (3600000 milisekund), lub to pierwsze pobranie danych
    if (timeDiff >= 3600000 || lastUpdateTime === 0) {
        var xhr = new XMLHttpRequest();
        const premiseStatus01B = document.getElementsByClassName("premiseStatus01B")[0];
        const premiseStatusImage01B = document.getElementsByClassName("premiseStatusImage01B")[0];
var url = "https://web-production-d9c9.up.railway.app/https://diamondhill.voxdeveloper.com/webservice/realestatestatuslist/api_key//investment_id/2";
        xhr.open("GET", url, true);

        // Dodanie nagłówków do zapytania
        xhr.setRequestHeader("Retry-After", "3600");
        xhr.setRequestHeader("X-PINGOTHER", "pingpong");
        xhr.setRequestHeader("Accept", "text/html");

        // Obsługa odpowiedzi z serwera
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    // Parsowanie odpowiedzi XML
                    var responseXML = xhr.responseXML;

                    // Znalezienie wszystkich elementów "realestate"
                    var realestates = responseXML.getElementsByTagName("realestate");

                    // Przeszukanie elementów w poszukiwaniu id = 2041
                    for (var i = 0; i < realestates.length; i++) {
                        var idElement = realestates[i].getElementsByTagName("id")[0];
                        var statusNameElement = realestates[i].getElementsByTagName("status_name")[0];
                        var idValue = idElement.textContent;
                        var statusNameValue = statusNameElement.textContent;
                        // Jeśli znaleziono id = 2041, wypisz informacje
                        if (idValue === "2051" && statusNameValue === "Umowa rezerwacyjna") {
                            premiseStatusImage01B.src = "budynek-B-ogrodki-reserved-01.png";
                            premiseStatus01B.innerHTML = "Zarezerwowany";
                            premiseStatus01B.style.color = "red";
                            // Tutaj możesz wypisać więcej informacji, jeśli istnieją inne elementy
                        } else if (idValue === "2051" && statusNameValue === "Dostępne") {
                            premiseStatusImage01B.src = "budynek-B-ogrodki-available-01.png";
                            premiseStatus01B.innerHTML = "Dostępne";
                            premiseStatus01B.style.color = "darkgreen";
                        }
                    }

                    lastUpdateTime = currentTime; // Aktualizacja czasu ostatniego pobrania danych
                }
            }
        };
        xhr.send();
    }
}

setInterval(timeDate, 1000);

z góry dziękuję. 

komentarz 5 października 2023 przez adrian17 Mentor (354,120 p.)
BTW, wyciekł Ci api key.
komentarz 5 października 2023 przez Kamil3224 Nowicjusz (210 p.)
Key jest testowy. Ale dzięki :D
komentarz 5 października 2023 przez VBService Ekspert (256,600 p.)

@Kamil3224,  BTW, wink

// Przeszukanie elementów w poszukiwaniu id = 2041

...

// Jeśli znaleziono id = 2041, wypisz informacje

if (idValue === "2051" && statusNameValue === "Umowa rezerwacyjna")

komentarz 6 października 2023 przez Kamil3224 Nowicjusz (210 p.)
Dzięki :D

1 odpowiedź

0 głosów
odpowiedź 5 października 2023 przez Comandeer Guru (607,060 p.)
A czemu, skoro ta logika ma się odpalać raz na godzinę, nie zrobisz po prostu interwału na jedną godzinę? Wówczas nie trzeba nic obliczać, a i funkcja niepotrzebnie nie będzie się odpalała co sekundę. Ten pierwszy raz, który ma się odpalić od razu, to można przecież odpalić poza interwałem.
komentarz 5 października 2023 przez Kamil3224 Nowicjusz (210 p.)
Rozumiem, chodzi bardziej o to, aby logika się odpalała tylko raz i potem za godzinę, a bez tego skrypt będzie się odpalała za każdym razem, gdy strona będzie odświeżana. Chodzi żeby nie było zbyt dużo zapytań to serwera, bo to może zamulić stronę. Myślałem też o zapianu tego do pamięci podręcznej ale tu też jest dużo zabawy.
1
komentarz 5 października 2023 przez Comandeer Guru (607,060 p.)

Hmm, ale ta logika też nie zadziała przy odświeżeniu strony, bo przy każdym odświeżeniu zmienna lastUpdateTime będzie resetowana do wartości 0. Musiałbyś to zapisywać do localStorage i stamtąd odczytywać.

No i jak już byś tam to zapisywał, to nic nie stoi na przeszkodzie, żeby obliczyć sobie, ile brakuje do godziny, i ustawić setTimeout() na ten okres. Ogólnie raczej tu bym się właśnie przesiadł na setTimeout(), bo da większą kontrolę nad czasem odpalenia kolejnego sprawdzenia.

komentarz 6 października 2023 przez Kamil3224 Nowicjusz (210 p.)
Super, dzięki za pomoc :D

Podobne pytania

0 głosów
1 odpowiedź 3,652 wizyt
pytanie zadane 20 lutego 2018 w JavaScript przez sosick Nowicjusz (160 p.)
0 głosów
1 odpowiedź 566 wizyt
pytanie zadane 19 października 2016 w JavaScript przez Muhin Gaduła (4,120 p.)
0 głosów
1 odpowiedź 324 wizyt

93,434 zapytań

142,429 odpowiedzi

322,662 komentarzy

62,799 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...