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