定义

维基百科:
响应式编程或反应式编程(英语: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 声明式
//命令式:告诉计算机该怎么做
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
  });
}
复制代码
纯函数

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

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];
}
复制代码
不可变性

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

观察者模式



迭代器模式

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

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

函数响应式编程的优势

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