RxJS: является ли хорошей практикой отписываться от наблюдаемых объектов при переходе от них?

#rxjs #unsubscribe

#rxjs #отписаться

Вопрос:

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

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

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

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

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

Комментарии:

1. В вашем коде вы ни на что не подписываетесь, поэтому отписываться не от чего.

2. @torazaburo: код немного «псевдо», но я думаю, что была подписка, чтобы получить «elmt.mouseDowns» наблюдаемым…

Ответ №1:

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

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

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


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

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

 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 более observable с текущим местоположением, которое вернет observable (как app$ указано выше) для каждого местоположения… И снова вам не нужно подписываться / отписываться вручную — flatMapLatest это будет сделано внутренне.