2016-10-13 58 views
0

我剛剛進入RxJs和Observables一般。我明白了通常你可以通過使用「takeUntil()」來創建「獨立的」Observable。RxJs:在離開時取消訂閱Observables是否是一種很好的做法?

在一個網絡課程中,我看着老師說:「我沒有退訂10年的任何東西,因爲我總是使用takeUntil()來創建結束事件流」。這是他的例子:

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

這對於「內部」觀察對象來說非常好。但是「mousedown」上的一個外部Observable從未真正取消訂閱...

我們是否還需要取消訂閱這些內容? 當用戶離開頁面時,取消訂閱/處理是否仍然是一種好的做法?

+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將在內部完成。

相關問題