RxJS的另外四種實現方式(序)

  • 本文適合人羣:瞭解Rx編程人士、Javascript發燒友
  • 本文涉及概念:響應型編程NodeJs函數式編程

背景

本人自從讀過一篇來自Info的《函數式反應型編程(FRP) —— 實時互動應用開發的新思路》後便迷戀上了Rx,甚至以當時的Rxjs庫移植了一套適用於Flash的AS3.0的Rx庫ReactiveFl,也在實際開發中不斷實踐體會其中的樂趣。最近在知乎上無意中看到有人提到了一個名爲callbag的項目,引發了我很大的興趣,甚至×××觀看了作者的視頻Callback Heaven - Andre Staltz看完視頻,我久久不能平靜,這是多麼的奇思妙想,然而當我運行了作者代碼庫裏面的性能測試的時候,另一個不爲人所知的庫出現了,叫做Most。這個庫性能了得,遠遠超過同類的庫,然後我就想是否可以結合兩者的優勢,創造出性能高超,但設計巧妙又通俗易懂的Rx庫呢?於是我做了如下的嘗試:

RxJs的四種實現方式

  1. 實現代碼最小的庫(受callbag啓發)
  2. 性能最好的庫(參考了Most)
  3. 利用js的生成器實現的庫(突發奇想)
  4. 擴展Nodejs的Stream類實現的庫(受Event-Stream的啓發)

    受到以上的啓發,我又實現了Golang的Rx庫
    源碼請關注我的github,https://github.com/langhuihui

Rx實現的關鍵功能

要實現一個Rx庫,關鍵在於實現數據的推送以及消費過程中的四個基本功能:

  1. 訂閱:即激活Rx數據流的每一個環節,生產者此時可以開始發送數據(某些生產者並不關心是否有人訂閱)
  2. 發送/接受 數據:生產和消費的核心功能
  3. 完成/異常:由生產者發出的事件
  4. 取消訂閱: 由消費者觸發終止數據流,回收所有資源
生產者
(*)-------------(o)--------------(o)---------------(x)----------------|>
 |               |                |                 |                 |
Start          value            value             error              Done
消費者
(*)-------------(o)--------------(o)---------------(x)----------------|>
 |               |                |                 |                 |
Subscribe      onNext           onNext            onError         onComplete

上述過程中,如果用戶調用了unSubscribe/Disopse的方法,就可以中斷,從而不再觸發任何事件

Rx的兩種書寫模式

  1. 鏈式編程
  2. 管道模式

本人利用js的Proxy類,實現了一個庫同時實現兩種書寫模式的解決方案,我會在後續的文章中解釋其中的原理。
(未完待續)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章