Wykrywanie zmiany danych w subscribe, gdy mamy wielu użytkowników

Wykrywanie zmiany danych w subscribe, gdy mamy wielu użytkowników

Wątek przeniesiony 2024-06-03 09:27 z JavaScript przez Riddle.

K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 46
0

Witam, mam fullstackową aplikację ( Java + Angular) i ona tworzy sobie obiekty ( oraz inne CRUDy ), dajmy na to superbohaterów. Jest tu też baza danych. I moje pytanie: subscribe z superbohaterami wykrywa zmiany dopiero, gdy bieżący użytkownik coś zmieni. I wtedy prawidłowo wykryje też zmiany od innych użytkowników(jeśli są). Natomiast gdy bieżący użytkownik nie robi zmian, a inni użytkownicy robią, to ten subscribe nie wykrywa nic. Pytanie jak osiągnąć stan, że np. mamy dwóch użytkowników równolegle robiących zmiany i żeby każdy widział zmiany i swoje i od innych od razu?
Próbowałem z

Kopiuj
this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {this.router.navigate(['anti-heroes']);});

I wykrywa wszystko, gdy włożę to w setInterval częsty, ale wtedy odzywa się ten subscribe wspomniany i co każdy interwał podwaja się liczba wejść do tego subscribe nawet gdy nic się nie robi. Więc albo mi podpowiecie co tu poprawić? Bo nie wiem dlaczego to po prostu nie działa? Albo proszę o radę jak to poprawnie wykrywać?

PS. Mam nadzieję, że dobre miejsce forum wybrałem.

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
0

a czy ten subscribe jest z nami teraz w pokoju?

Ktos1 napisał(a):

I wykrywa wszystko, gdy włożę to w setInterval częsty, ale wtedy odzywa się ten subscribe wspomniany i co każdy interwał podwaja się liczba wejść do tego subscribe nawet gdy nic się nie robi.

nic z tego nie rozumiem, ale jak używasz subscribe to powinieneś też używać unsubscribe gdzieś. Najlepiej w onDestroy

K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 46
0
obscurity napisał(a):

a czy ten subscribe jest z nami teraz w pokoju?

Ktos1 napisał(a):

I wykrywa wszystko, gdy włożę to w setInterval częsty, ale wtedy odzywa się ten subscribe wspomniany i co każdy interwał podwaja się liczba wejść do tego subscribe nawet gdy nic się nie robi.

nic z tego nie rozumiem, ale jak używasz subscribe to powinieneś też używać unsubscribe gdzieś. Najlepiej w onDestroy

Spróbuję opisać bardziej zrozumiale.
W pliku mam:

Kopiuj
ngOnInit() {
    this.assignAntiHeroes();
    setInterval(() =>{
                this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {this.router.navigate(['anti-heroes']);});
            }
        },5000);
}

oraz:

Kopiuj
assignAntiHeroes() {
      this.subscription= this.antiHeroes$.subscribe((data:ReadonlyArray<AntiHero>) =>{
      this.antiHeroes = data;;
      console.log("Changes1");
    });

  }

oraz:

Kopiuj
ngOnDestroy() {
        this.subscription.unsubscribe();
 }

I to działa tak, że co 5 sekund odświeża mi z antiHeroes komponent, ale nie całą stronę, czyli tak jak chciałem ( wykrywa wszystkie zmiany, innych użytkowników też). Niestety przy każdym odświeżaniu przez zawartość interval podwaja się liczba wywołań console.log("Changes1") czyli zawartości subscribe(tak to sobie testuję). Np. kolejne ilości wywołań tego console.log("Changes1") co kolejny interwał: 1,2,4,8,16 itp. zamiast zawsze tylko 1(w sytuacji gdy nic nie zmieniam przy antiHeroes). I właśnie używam unsubscribe, a i tak jest ten problem. Zauważyłem, że to "podwajanie" jest na skutek tego kodu i max po kilkudziesięciu sekundach trzeba wyłączać program:

Kopiuj
this.router.navigateByUrl('/', {skipLocationChange: true}).then(() => {this.router.navigate(['anti-heroes']);});

Czyli na jedno on pomaga a na drugie szkodzi. Ponawiam pytanie, jak wykrywać zmiany u wszystkich użytkowników naraz na żywo jakąś inną metodą, albo co w tym moim kodzie mógłbym poprawić, żeby tak działało.

RJ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 484
0

Ale czemu tak dziwnie reloadujesz stan? To po to masz przecież typ Observable, żeby dzięki niemu poprzez strumień pozyskiwać dane.

Jeśli taki Observable dostanie nowe dane to z automatu jak masz subscribe to powinno tam polecieć.

Już nie mówiąc o tym, że takie manualne subscribe wewnątrz komponentu to tak średnio trochę i lepiej byłoby wykorzystać async pipe.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.