W JavaScript wzorzec obserwatora jest często używany. Jest z tym jedna trudna sprawa i to jest odniesienie, które utrzymuje obserwator. Wymagają sprzątania. Dla zwykłych aplikacji używam następujące reguły kciuka:Czy funkcjonalne programowanie reaktywne w JavaScript powoduje większe problemy z odniesieniami do słuchacza?
- Jeżeli obiekt ma żywotność krótsza niż (lub równy) obserwator, mogę tylko zrobić
subject.on('event', ...)
- Jeżeli obiekt ma żywotność dłużej od obserwatora, muszę korzystać
observer.listenTo(subject, 'event', ...)
W drugim przypadku, listenTo
jest świadomy cyklu obserwatora, a zostanie ona automatycznie usunąć słuchaczy, gdy nadszedł czas dla obserwatora na śmierć.
W nowoczesnym stylu SPA (Single Page Application), w którym tylko części aplikacji są aktywne w dowolnym momencie, staje się to bardzo ważne. Jeśli połączysz to z gniazdami internetowymi, które są idealnym kandydatem do strumienia wydarzeń i najprawdopodobniej długo żyją, staje się to jeszcze ważniejsze.
Dzięki FRP, dysponując czymś takim jak strumień zdarzeń reprezentujący zmieniające się wartości w czasie, jestem (nie wiedząc o tym), tworząc wielu słuchaczy. Każdy filter
, map
i tworzy nowy strumień, który jest związany (prawdopodobnie za pomocą słuchacza) z poprzednim.
Moim zdaniem wydaje się dość trudne określenie, w jaki sposób i kiedy należy usunąć tych słuchaczy. Nie mogę sobie wyobrazić, że jestem pierwszą osobą, która pomyślała o tym problemie, ale nie mogłem znaleźć zbyt wielu informacji w Internecie.
Widziałem niektóre frameworki w innych językach używają słabych referencji. JavaScript nie ma pojęcia słabych referencji (nie ma tutaj zastosowania WeakMap). Nawet jeśli tak było, wydaje się, że jest to zły pomysł, ponieważ nie jest jasne, kiedy odbywa się zbieranie śmieci.
- Jak to rozwiązano w obecnych ramach?
- Czy ramy wiążą się z cyklem życia obiektów? Jeśli tak: w jaki sposób?
Jeśli uważasz, że to pytanie powinno zostać zamknięte, dodaj komentarz. Może dodaj sugestię, aby pytanie było bardziej szczegółowe. A może wskaźnik do miejsca, w którym to pytanie lepiej pasuje. Jeśli nie jest jasne, zadaj pytania. Naprawdę chcę użyć FRP. – EECOLOR
Przepraszam, musiałem głosować, aby zamknąć. To pytanie jest zbyt otwarte. –
@JK. Czy masz jakieś sugestie dotyczące poprawy tego pytania? – EECOLOR