响应式编程(学习小结)

定义

维基百科:
响应式编程或反应式编程(英语:Reactive programming)是一种面向数据流变化传播的编程范式。

对于响应式编程,不同语言都有相应的扩展库。例如RxJava、RxAndroid、RxJS等等。

官网:
An API for asynchronous programming with observable streams
用于使用可观察流进行异步编程的API

个人理解:
创建出数据流(事件流),使用操作符对数据流进行组合转换订阅此数据流来执行其他功能。或者说监听到数据流后来执行其他功能。

扩展库

Reactive Extension,也叫ReactiveX,或者简称Rx,指的是实践响应式编程的一套工具(库)。
改进了异步编程模型。
开发语言并没有天生对响应式编程支持,所以需要对编程语言做一层功能扩展。

例如:RxJava、RxJs、RxAndroid

它对观察者模式进行了扩展,以支持数据和(或)事件序列;并添加许多运算符,这些运算符可以以声明方式组合;同时抽象出对以下问题的关注:低级线程,同步,线程安全,并发数据结构和非线程等。

结合优秀的思想

响应式编程结合了如下三种优秀的思想:

  • 观察者模式
  • 迭代器模式
  • 函数式编程

下面重点说一下函数式编程

函数式编程

函数式编程就是非常强调使用函数来解决问题的一种编程方式。

此处的函数有特殊的要求:

  1. 声明式
  2. 纯函数
  3. 数据不可变性

命令式 vs 声明式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//命令式:告诉计算机该怎么做
function double(arr) {
const results = []
for (let i = 0; i < arr.length; i++){
results.push(arr[i] * 2)
}
return results
}
//声明式:告诉计算机做什么
function double(arr) {
return arr.map(function(item) {
return item * 2
});
}

纯函数

函数的执行过程完全由输入参数决定,不会受除参数之外的任何数据影响。
函数不会修改任何外部状态,如修改全局变量或传入的参数对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

const array = [1, 2, 3];
const newArray = double(array);
//array 的值是[1,2,3]
//newArray 的值是[2,4,6]


const originalArray = [1, 2, 3];
const pushedArray = arrayPush(originalArray, 4);
const doubledPushedArray = double(pushedArray);
// pushedArray值应该是[ 1, 2, 3, 4 ]
// doubledPushedArray值应该是 [ 2, 4, 6, 8 ]

const doubleOriginArray = double(originalArray);
//doubleOriginArray值应该是 [ 2, 4, 6, 8 ]; originalArray被arrayPush方法修改了。

//再看arrayPush代码,显然不是一个纯函数
function arrayPush (arr, newValue) {
arr.push(newValue);
return arr;
}
//修改如下
function arrayPush (arr, newValue) {
return [...arr, newValue];
}

不可变性

程序中的数据自然是需要变化的。这里的不可变性是指保持原有数据不变。
当我们需要数据状态发生改变时,保持原有数据不变,产生一个新的数据来体现这种变化。

观察者模式

观察者模式

迭代器模式

能够遍历一个数据集合的对象。就是提供一个通用的接口,让使用者完全不用关心这个数据集合的具体实现方式。

1
2
3
4
5
const iterator = getIterator();
while (iterator.isDone()) {//是否遍历完所有元素
console.log(iterator.getCurrent());//获取当前游标所指向的元素
iterator.moveToNext ();//将游标移动到下一个元素
}

Observable弹珠图

Observable弹珠图

弹珠图

https://rxviz.com/examples/custom

RxJS源码

https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts

函数响应式编程的优势

数据流抽象了很多现实问题。
擅长处理异步操作。
把复杂问题分解成简单问题的组合。

坚持原创技术分享,您的支持将鼓励我继续创作!