Zachowanie tej samej wartości zmiennej przy wielu żądaniach

0

Posiadam stronę WWW, na której chciałbym umieścić pewną wartość, która zmienia się w czasie w zależności od pewnych danych. Jednakże, chciałbym też, aby wartość ta była zsynchronizowana tzn. po otworzeniu w kolejnej zakładce przeglądarki nowej instancji mojej strony, wartość ta była taka sama.

Wybaczcie zawiłość, już tłumacze przejrzyściej:

Wartość ta ma zmieniać się co 15 sekund. Zatem jeśli ktoś otworzy dwie strony z pięciosekundowym opóźnieniem, na jedej zobaczy wartość jedną, a na drugiej wartość inną, która zmieni sie na aktualną dopiero za 10 sekund. Chciałbym wyeliminować to opóźnienie, ew. mogę sobie pozwolić na max. 1 sekundową rozbieżność.


var wartosc = "11 produktow, m.in. żelazko";
var czas = 1502; //sekund
var reszta = czas % 15 //reszta, czyli za tyle sekund powinno się zmienić

if(reszta > 1) {
    window.setTimeout(function() {
            uaktualnijProduktomierz();
            setInterval("uaktualnijProduktomierz()", 15000);
    }, reszta*1000);
}
else {
    setInterval("uaktualnijProduktomierz()", 15000);
}

Zastosowałem powyższe rozwiązanie, jednakże nie działa ono prawidłowo, tzn. opóźnienia są znacznie większe niż 1 sekunda.
Proszę o wytknięcie błędów w moim rozumowaniu :)

0

a czy ta wartość może się zmieniać np o x:00, x:15, x:30, x:45 we wszystkich kartach, czy nie możesz tego tak ustalić?

0

Niestety nie mogę. Wiem że wtedy mógłbym to łatwo rozwiązać, niestety nie mam nad tym kontroli.

0

więc zastosuj cookies i zapisz tam liczbę z zakresu 0-14 czyli punkt startowy dla wszystkich odświeżeń i pierwsza strona zapisuje, a wszystkie odczytują
warto też zapisać niezbyt wielką żywotność tego cookies, żeby po wyłączeniu przeglądarki na kilka minut i ponownym włączeniu dane się zresetowały, a włączonej przeglądarce żywotność się przedłużała

0

Nie zrozumieliśmy się.

Kiedy ktoś drugi otworzy moją stronę na kolejnym komputerze, chcę żeby widniejąca tam wartość nadal była zsynchronizowana z tamtą poprzednią.

Działa to tak:

Przypadek 1:

//zmienna czas jest zależna od pewnych danych, jest to liczba sekund
var czas = 1502;
var reszta = czas % 15; // = 2 sekundy

Zatem chciałbym żeby f-cja uaktulanijProduktomierz() została wywołana 2 sekundy po otwarciu strony, a następnie co 15 sekund.

Przypadek 2:

//zmienna czas jest zależna od pewnych danych, jest to liczba sekund
var czas = 39;
var reszta = czas % 15; // = 9 sekundy

Tym razem chciałbym żeby f-cja uaktulanijProduktomierz() została wywołana 9 sekundy po otwarciu strony, a następnie co 15 sekund.

I tak dalej...

0

jak między komputerami, to przez serwer musisz, z pierwszej strony zaajaxuj wartość tej zmiennej na serwer i później każda strona odpytuje serwer o nią

0

Nie nie nie.

Nie rozumiemy się. Wytłumaczę jeszcze raz:

Po wejściu użytkownika na stronę, ma on ujrzeć pewną wartość zmieniającą się co 15 sekund.
Żeby zachować synchronizację takiej wartości, ma ona przypisaną datę, od której zaczęła się zmieniać. Wartość tej daty (liczba sekund) to własnie zmienna 'czas'.

Zatem chodziło by o to, aby:

  1. jeśli 'czas' jest podzielny przez 15 lub reszta z takiego dzielenia jest mniejsza niż 1 sekunda, wówczas po prostu dajemy setInterval("foo()", 15000)

  2. jesli reszta z dzielenia 'czasu' przez 15 jest większa od zera, wówczas chciałbym odczekać właśnie tą 'resztę' sekund, nastepnie uaktualnić ową wartość i dopiero wtedy ustawić setInterval

Próbowałem osiągnąć to przez kod podany przeze mnie w pierwszym poście, który nawiasem mówiąc nawet teraz wygląda dla mnie w porządku i nie mam pojęcia dlaczego nie działa.

Proszę wybaczyć jeśli to zbyt zawiłe, prościej już nie umiem.

0

Z tego, co ja zrozumiałem, to zrobiłbym tak:

var czas = 1111,
  reszta = czas % 15;
(function() {
  if (reszta != 15) {
    // aktualizuj
    uaktulanijProduktomierz();
    
    // uaktualnianie co 15 sekund
    setInterval(uaktulanijProduktomierz, 15 * 1000);

    reszta = 15;
    return;
  } else {
    // pierwsza aktualizacja za 'reszta' sekund
    setTimeout(arguments.callee, reszta * 1000);
    return;
  }
  
  
})();

0

Po przemyśleniach, chyba już poprawna wersja:

var czas = 1111, reszta = czas % 15;
function ustawCzasAktualizacji()
{
  if (reszta != 15) {
    reszta = 15;

    // następne wywołanie tej funkcji przejdzie do 'else'
    // ale funkcja ta musi odczekać 'reszta' sekund zanim zostanie wywołana, stąd setTimeout
    setTimeout(ustawCzasAktualizacji, reszta * 1000);

    // wywołaj funkcję 'uaktualnijProduktomierz' za 'reszta' sekund
    setTimeout(uaktualnijProduktomierz, reszta * 1000);
  }
  else
    setInterval(uaktualnijProduktomierz, 15 * 1000);
}

ustawCzasAktualizacji();

Reszta w tym przypadku wynosi 1, produktomierz ma się zaktualizować po 1 sekundzie, a następnie co 15 sekund. Przeanalizuj krok po kroku co się dzieje, myślę, że to jest to, czego potrzebujesz :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1