RxJs: хорошо ли отказаться от подписки на Observables при навигации?

Я просто вхожу в RxJs и Observables в целом. Я понял, что часто вы можете создавать «автономные» наблюдения, используя «takeUntil ()».

В одном онлайн-курсе я наблюдаю, как учитель говорит: «Я не отказался от подписки на что-либо через 10 лет, потому что я всегда использую takeUntil () для создания конечных потоков событий». Это его пример:

var getElementDrags = elmt => elmt
    .mouseDowns.map(() => document.mouseMoves.takeUntil(document.mouseUps))
    .concatAll();

Это очень хорошо для «внутренних» наблюдений. Но один внешний Observable на «mousedown» никогда не получает от подписки ...

Нужно ли нам отменить подписку? По-прежнему ли хорошая практика отказаться от подписки / распоряжаться, когда пользователь покидает страницу?

rxjs,unsubscribe,

0

Ответов: 1


0

В примере, который у вас есть - вы не подписываетесь ни на что ... RxJS ленив, и он будет подписаться mouseDownsтолько тогда, когда вы подпишетесь на итоговый наблюдаемый, и, конечно же, - он отменит подписку на подчеркивание наблюдаемых, когда вы отмените подписку на итоговые наблюдаемые.

Но, как правило, да, это хорошая практика, чтобы отказаться от подписки, когда вы подписываетесь на что-то ... Но - при использовании RxJS обычно вам не нужно подписываться вручную, а когда вам нужно - есть вероятность, что вам нужна подписка, пока приложение (поэтому нет необходимости отписываться).

Единственными исключениями являются - когда вы разрабатываете собственных операторов или подключаетесь к чему-то за пределами |


Например, если вы реагируете на компонент и используете скачки жизненного цикла для подписки на обновления на mount и отмените подписку при размонтировании.

Вот моя библиотека для этой цели https://github.com/zxbodya/rx-react-container - она ??объединяет наблюдаемые объекты, предметы и реагирует на новые наблюдаемые с визуализируемыми элементами ...

const app$ = createContainer(
  App, // react component
  {totalCount$}, // observables with data
  {plusOne$, minusOne$} // observers for user actions
);

const appElement = document.getElementById('app');
const appSubscription = app$.forEach(renderApp=>render(renderApp(), appElement));

В результате у вас есть только одна подписка для управления для целого приложения ( appSubscription), и нет необходимости отменять подписку - поскольку она используется во время работы приложения.

То же самое, что касается маршрутизации и отмены подписки при навигации - в упрощенном случае вы будете как можно flatMapLatestболее заметны с текущим местоположением, которое вернется к наблюдаемому (например, app$выше) для каждого местоположения ... И снова вам не нужно подписываться / отписаться вручную - flatMapLatestсделают это внутренне.

rxjs, отписки,
Похожие вопросы