RxJs: хорошая ли практика - отказаться от подписки на Observables при уходе?

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

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

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

Это очень хорошо для "внутренних" Observables. Но один внешний Observable на "mousedown" никогда не отписывается от ...

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


person Wolfgang    schedule 13.10.2016    source источник
comment
В вашем коде вы ни на что не подписываетесь, поэтому не от чего отказываться.   -  person    schedule 13.10.2016
comment
@torazaburo: Код немного псевдо - но я думаю, что была подписка на получение наблюдаемого elmt.mouseDowns ...   -  person Wolfgang    schedule 14.10.2016


Ответы (1)


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

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

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


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

Вот моя библиотека для этой цели 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 сделает это внутренне.

person Bogdan Savluk    schedule 16.10.2016