2016-12-03 26 views
1

假設你有一個express風格處理函數是這樣的:rxjs,節點,在處理訂閱內存泄漏

(req, res, next) => { 
    const requestedProgramIDs = req.body.programIDs; 
    // assume all data is in a cache observable 
    cache$.filter(data => requestedProgramIDs.indexOf(data.id) >= 0) 
    .toArray() 
    .subscribe(programs => res.end(JSON.stringify(programs))) 
}; 

我的問題是將這種訂閱泄漏內存?我擔心,如果我只是unsubscribe在函數的結尾,那麼不能保證訂閱代碼將執行。

我的解決方案的想法如下:

  • 使用.take(1)確保退訂
  • 如果scheduler對於觀察到的是同步的,那麼退訂將是同步的,我可以把它釘住結束的功能。

問題:

  • 我是正確的思維認購會泄漏?
  • 如果,那麼你會如何建議我處理(防止)泄漏?

回答

2

註冊和取消的Observable Contract狀態部分:

當可觀察到的問題進行的OnError或通知的onComplete其觀察員,這結束認購。觀察者不需要發出取消訂閱通知來結束由Observable以這種方式結束的訂閱。

所以,如果你觀察到cache$完成 - 它必須爲toArray運營商做,發射陣列 - 沒有必要調用unsubscribe。只要組成的observable完成或錯誤,它就不會泄漏。

此外,您可能希望線了next,從而使錯誤被轉發到快遞:

.subscribe(programs => res.end(JSON.stringify(programs)), next)