大家好,本文介紹我們為什么使用函數式反應式編程來開發引擎,以及它在引擎中的相關的知識點。
上一篇博文
下一篇博文
介紹函數式反應式編程
函數式反應式編程又稱為“函數式響應型編程”,英文縮寫為“FRP”。
它的總體思想是一切都是流:可以把事件封裝為流,也可以把Promise封裝為流,還可以把集合(如數組、list等)封裝為流。可以用 merge、concat、map等operater對流進行函數式操作。
本質上,FRP是把時間線上的數據建模為流,即:
流 = 時間 + 數據
我們在對流進行一系列操作后,最后會subscribe該流,處理流的三個事件:next、error、complete。
舉例來說:
我們把數組[|1,2,3|](在Reason中,數組的語法是“[||]”,list的語法是“[]”)封裝為流並subscribe,則該流會依次觸發3次next事件,值分別為:1、2、3;在最后一次next事件觸發后,會觸發complete事件,完成該流;該流不會觸發error事件,因為沒有錯誤發生。
函數式反應式編程學習資料
該文通俗易懂,建議讀者通過該文來入門FRP。
該文舉了一個FRP的例子,並比較了“FRP”和“回調函數callback”這兩種處理異步的方式。該文適合讀者進一步學習FRP。
讀者可以通過該問題的討論,了解為什么要用FRP。
函數式反應式編程的優點與缺點
優點
- 抽象層面更高
FRP以流為單位,封裝了時間序列和具體的數據,隱藏了“狀態的同步”、“異步邏輯的具體實現”等底層細節。
- 和函數式編程配合使用
能夠使用組合,像管道處理一樣處理各種流,符合函數式編程的思維。
缺點
- 學習成本高,需要用戶轉換思維,用流來思考
我當時用了1個月學習FRP,並模仿Rxjs,使用Typescript寫了一個FRP庫:Wonder-FRP。
掌握FRP確實不容易,但一旦掌握,異步處理就會變得非常容易和健壯,值得我們學習它!
異步處理的其它方法
除了用“FRP”處理異步,還可以用:
1)回調函數
過多的回調會導致嵌套層次太深,容易陷入回調地獄,不易維護。
2)await,aync
通過這兩個關鍵字,把所有異步操作變為同步操作。
這樣雖然簡化了邏輯,但是損失了異步帶來的性能優勢(如把兩個並行操作變為兩個串性操作,增加了時間開銷)
為什么使用Most庫
要在Javascript中使用FRP,有兩個庫可以選擇:
為了更高的性能,本系列使用most庫來開發引擎,並封裝了它的FFI。
引擎中相關的函數式反應式編程知識點
引擎使用函數反應式編程來處理異步。
FRP的流來自於:
-
Promise
如將“加載圖片”封裝為Promise,再用most.fromPromise將其轉換為流。 -
Dom事件
如對於“鼠標click”事件,使用most.fromEvent將其轉換為流。 -
集合
使用most.from將集合(如數組或者list)轉換為流。
FRP的應用場景包括:
1)處理事件
2)處理多個線程的執行順序
3)讀寫資源