原文:


大家好,本文介绍我们为什么使用函数式反应式编程来开发引擎,以及它在引擎中的相关的知识点。

介绍函数式反应式编程

函数式反应式编程又称为 “函数式响应型编程”,英文缩写为 “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,有两个库可以选择:

  • RxJS
    该库用的人很多,功能齐全。
  • most
    该库性能更好,而且更轻量。虽然功能要少点,不过够用,

为了更高的性能,本系列使用 most 库来开发引擎,并封装了它的FFI

引擎中相关的函数式反应式编程知识点

引擎使用函数反应式编程来处理异步
FRP 的流来自于:

  • Promise
    如将 “加载图片” 封装为 Promise,再用 most.fromPromise 将其转换为流。
  • Dom 事件
    如对于 “鼠标 click” 事件,使用 most.fromEvent 将其转换为流。
  • 集合
    使用 most.from 将集合(如数组或者 list)转换为流。

FRP 的应用场景包括:
1)处理事件
2)处理多个线程的执行顺序
3)读写资源**