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

上一篇博文

从0开发3D引擎(五):函数式编程及其在引擎中的应用

下一篇博文

从0开发3D引擎(七):学习Reason语言

介绍函数式反应式编程

函数式反应式编程又称为“函数式响应型编程”,英文缩写为“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)读写资源

参考资料

用函数式编程,从0开发3D引擎和编辑器(二):函数式编程准备

最新文章

  1. [转]ASP.NET应用程序生命周期趣谈(三) HttpModule
  2. redis分片
  3. js_继承
  4. 学习web前端开发基础技术需要掌握:HTML、CSS、JavaScript语言
  5. 初识HTML
  6. Kerberos简介及常见问题
  7. FileInputStream、FileReader、FileInputStream、FileWriter使用小结
  8. expdp小记
  9. 【python】__future__模块
  10. POJ1088滑雪
  11. js页面刷新一次
  12. 教训 Mac下装windows系统 失败后 磁盘空间丢失
  13. 自己写的日志框架--linkinLog4j--日志框架的必要性
  14. 【AGC030D】Inversion Sum DP
  15. 安装oracle11g INS-30131执行安装程序验证所需的初始设置失败的解决方法
  16. Boto3
  17. Mac上深色模式下的精美炫酷软件
  18. leetcode3
  19. python---str和repr
  20. PrintNumber.java

热门文章

  1. laravel 授权使用gate门类
  2. tp3.2.3 解决http://lx.com/后必须加index.php才能访问的问题,配置文件中忘了加index index.php index.html 等默认文件
  3. ArrayList中remove方法和set(null)的区别
  4. Python工程编译成跨平台可执行文件(.pyc)
  5. 【t018】派对
  6. 模版——KMP
  7. linux scull 的设计
  8. Java中i++和++i
  9. H3C查看、删除已经保存配置文件--用户图示(console)以上
  10. javascript基础之循环