[Javascript] 非同步處理: RxJS

RxJS
https://github.com/ReactiveX/rxjs

RxJS web
https://rxjs-dev.firebaseapp.com/

RxJS doc
https://rxjs-dev.firebaseapp.com/api

RxJS 中文文檔
https://cn.rx.js.org/

希望是最淺顯易懂的 RxJS 教學
https://blog.techbridge.cc/2017/12/08/rxjs/

30 天精通 RxJS
https://ithelp.ithome.com.tw/users/20103367/ironman/1199

學習 RxJS
https://rxjs-cn.github.io/learn-rxjs-operators/

[譯] RxJS Observable 與 Promises 和 Async-Await 交互
https://juejin.im/post/59a7f3005188252449136354

不要把Rx用成Promise
https://zhuanlan.zhihu.com/p/20531896

從 RxJS 到 Flink:如何處理資料流程?

Rxjs科普&在React hooks項目的使用探索

RxJS 是當前 web 開發中最熱門的 JavaScript 庫之一,它提供強大的功能性方法來處理非同步、以及同步事件,這得學習 Rx 變得前所未有的吸引人。並且,RxJS 幾乎涵蓋了所有語言,如果熟練掌握回應式程式設計 (reactive programming) 的話,那在更複雜的前後端通訊、各式非同步事件交互的實際需求當中,透過 RxJS 我們可更容易的處理資料流。

此外,我們乍聽之下會以為它是另外一種形式的Promise,同樣是避免callback hell,同樣是鏈式調用,然而事實上Promise和Rx是兩種截然不同的模式,不能混為一談。Promise顧名思義,提供的是一個允諾,這個允諾就是在調用then之後,它會在未來某個時間段把非同步得到的result/error傳給then裡的函數。而 Rx不是允諾,它本質上還是由訂閱/發佈模式引出來的,它的核心思想就是資料回應式,源頭是資料產生者,經過一系列的變換/過濾/合併的操作,被資料消費者所使用,資料消費者何時回應,完全取決於資料流程何時能流下來。

Promise需要調用then或者catch才能夠執行,catch是另一種形式的then,調用then或者catch之後,它返回一個新的Promise,這樣新的Promise也可以同樣被調用,所以可以做成無限的then鏈。但是,Rx的資料是否流出不取決於是否subscribe,也就是說一個observable在未被訂閱的時候也可以流出資料,在之後它被訂閱過後,先前的資料是無法被資料消費者所查知,所以Rx還引入了一個lazy模式,允許資料緩存著直到被subscribe,但是資料是否流出還是並不依賴subscribe。

Promise的資料是一次性流出的,因為Promise內部維持著狀態,初始化的pending,轉成resolved或者rejected之後,狀態就不可逆轉了。而Rx則不同,我們從Rx的介面就可以知道,它有onNext,onComplete和onError,onNext可以響應無數次,這也是符合我們對資料響應式的理解,資料在源頭被隔三差五的發出,只要源頭認為沒有流盡(onComplete)或者出了問題(onError),那麼資料就可以不斷的流到回應者那邊。


#RxJS, Javscript, reactive programming, observable, subscribe, promise

留言