你就是函数响应式编程(FRP)啊?!【附 RxJS 实战】

2022-09-19 10:45:28 浏览数 (2)


theme: smartblue

前言

什么是 FRP?

英文全称是:Functional Reactive Programming,翻译过来就是:函数响应式编程

对于函数式编程,我们并不陌生,在 我的 JS 专栏 里面可以找到很多相关文章~~

这里不妨先对函数式编程特性做简要回顾:

  1. 函数是一等公民(意味着可以把函数赋值给变量或存储在数据结构中,也可以把函数作为其它函数的参数或者返回值)
  2. 高阶函数(接受函数作为参数或者返回一个函数的函数)
  3. 没有隐式输入、输出(输入通过函数入参传递,输出通过函数 return 进行返回)
  4. 值的不变性(指在程序状态改变时,不直接修改当前数据,而是创建并追踪一个新数据)
  5. 声明式编程风格,而不是命令式编程风格(关注“是什么”,而不是“做什么”)

用代码举个简单例子:

代码语言:javascript复制
// 命令式编程
int factorial1(int x) {
    int result = 1;
    for (int i = 1; i <= x; i   ) {
        result *= i;
    }
    return result;
}

// 函数式编程
int factorial2(int x) {
    if (x == 1) return 1;
    return x * factorial2(x - 1);
}

以上代码用于实现计算阶乘。指令式编程,像机器一条条命令一样思考问题,一条条指令告诉计算机该怎么去处理这个问题。

而在函数式编程里面,思想是利用数学方法来思考问题。阶乘的数学表达式是:f(n) = n*f(n - 1) (n > 1)f(n) = 1 (n = 1) ,利用递归解决问题。这个过程中基本上没有状态量,只有表达式,也没有赋值语句。

OK,说到这里,对函数式编程有了一个大体的回顾,下面就介绍今天的主角 —— 函数响应式编程

正文

从名字上来看,就是多了 响应 二字,什么是“响应”?

各位一定不陌生!

简答来说就是:当数据发生变动时,会自动触发告知我们:它发生变化了~

Vue.js 底层不就是这种响应式吗?Vue2 通过 definedProperty 的 getter/setter 收集数据变化(依赖收集);

当我们在使用 vue 开发时,只要一有绑定的数据发生改变,相关的数据及画面也会跟着变动,而开发者不需要写关于“如何通知发生变化”的代码,只需要关注发生变化时要做什么事,这就是典型的 Reactive Programming(响应编程) 。

所以,可以大致猜到:函数响应式编程 = 函数式编程 响应编程

事实上,它也确实如此~

一图胜千言:

编程范式关系图(部分)

如图,在声明式编程里,有 2 大家族,分别是函数式编程和数据流编程;数据流编程衍生出响应式编程;而函数响应式编程继承了函数式编程和响应式编程(各自的优点);

  • 响应式编程能在运行时改变事件源(随时间变化的数据输入)的绑定处理,但数据流编程的组织是一开始就确定了的。

事件流

函数响应式编程(FRP) 可以更加有效率地处理事件流,而无需管理状态。

举个栗子

0 人点赞