2016-10-13 11 views
0

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

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

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

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

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

+0

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

+0

@torazaburo: Код немного «псевдо» - но я думаю, что была подписка на получение «elmt.mouseDowns» Observable ... – Wolfgang

ответ

0

В примере, который у вас есть - вы не подписываетесь ни на что ... 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 сделают это внутренне.