RxJs:在导航时取消订阅Observables是一种好习惯吗?

时间:2016-10-13 10:57:13

标签: rxjs unsubscribe

我刚刚进入RxJs和Observables。我抓住了这个想法,即你通常可以利用“takeUntil()”创建“自包含”的Observable。

在一个在线课程中,我正在看老师说“我没有在10年内取消订阅,因为我总是使用takeUntil()创建结束事件流”。这是他的榜样:

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

对于“内在的”Observable来说,这是非常好的。但是,关于“mousedown”的一个外部Observable从来没有真正取消订阅...

我们还需要取消订阅吗? 当用户离开页面时取消订阅/处置仍然是一种好习惯吗?

1 个答案:

答案 0 :(得分:0)

在示例中你有 - 你没有订阅任何东西...... RxJS是懒惰的,只有当你订阅了生成的observable时它才会订阅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将在内部进行订阅。