RxJS入门之函数响应式编程
一.函数式编程
1.声明式(Declarativ)
和声明式相对应的编程⽅式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的⼀种编程⽅式。
//命令式编程:
function double(arr) {
const results = []
for (let i = 0; i < arr.length; i++){
results.push(arr[i] * 2)
}
return results
}
function addOne(arr){
const results = []
for (let i = 0; i < arr.length; i++){
results.push(arr[i] +1)
}
return results
}
//声明式:
const double = arr => arr.map(item => item * 2);
const addOne = arr => arr.map(item => item + 1);
2.纯函数(Pure Function)
- 函数的执⾏过程完全由输⼊参数决定,不会受除参数之外的任何数据影响。简单的说,一个函数当它的输入值一致时,返回值永远是一致的。
- 函数不会修改任何外部状态,⽐如修改全局变量或传⼊的参数对象。
相反的不纯函数:
- 改变全局变量的值。
- 改变输⼊参数引⽤的对象,就像上⾯不是纯函数的arrayPush实现。
- 读取⽤户输⼊,⽐如调⽤了alert或者confirm函数。
- 抛出⼀个异常。
- ⽹络输⼊/输出操作,⽐如通过AJAX调⽤⼀个服务器的API。
- 操作浏览器的DOM。
满⾜纯函数的特性也叫做引⽤透明度(Referential Transparency),这是更加正式的说法。怎么称呼不重要,重要的是开发者要理解,所谓的纯函数,做的事情就是输⼊参数到返回结果的⼀个映射,不要产⽣副作⽤(Side Effect)。
3.数据不可变性(Immutability)
数据不可变(Immutable)是函数式编程⾮常重要的⼀个概念,程序要好发挥作⽤当然是要产⽣变化的数据,但是并不意味着必须要去修改现有数据,替换⽅法是通过产⽣新的数据,来实现这种“变化”,也就是说,当我们需要数据状态发⽣改变时,保持原有数据不变,产⽣⼀个新的数据来体现这种变化。不可改变的数据就是Immutable数据,它⼀旦产⽣,我们就可以肯定它的值永远不会变,这⾮常有利于代码的理解。
注意:JavaScript中的const关键字虽然有常数(constant)的意思,但其实只是规定⼀个变量引⽤的对象不能改变,却没有规定这个const变量引⽤的对象⾃⾝不能发⽣改变,所以,这个“常量”依然是变量。
问题:javascript算不算函数式编程语言?
从语言的角度上讲,javascript并是纯粹的函数式编程语言,JavaScript中的函数有第⼀公民的⾝份,因为函数本⾝就是⼀个对象,可以被赋值给⼀个变量,可以作为参数传递,由此可以很⽅便地应⽤函数式编程的许多思想。我们把函数式编程看作⼀种编程思想,即使语⾔本⾝不⽀持⼀些特性,我们依然可以应⽤这样的编程思想,⽤于提⾼代码的质量。所以,JavaScript并不是纯粹的函数式编程语⾔,但是,通过应⽤⼀些编程规范,再借助⼀点⼯具的帮助,我们完全可以⽤JavaScript写出函数式的代码,RxJS就是辅助我们写出函数式代码的⼀种。
二.响应式编程(Reactive Programming)
就像excell,试着⽤Excel把多个星期的花费综合加起来放在另⼀个叫c9格⼦⾥,c9能够对花费的格⼦的数值变化作出“响应”。
例如,在命令式编程环境中, a:=b+c表示将表达式的结果赋给 a,而之后改变 b 或 c的值不会影响 a。但在响应式编程中,a的值会随着 b或 c的更新而更新。
Reactive Extension 简称 Rx(响应式编程世界⾥知名度最⾼的框架)
An API for asynchronous programming with observable streams 。 Rx是⼀套通过可监听流来做异步编程的API。
Rx其实是⼀个⼤家族,在这个⼤家族中,还有⽤Java实现的RxJava,⽤C++实现的RxCpp,⽤Ruby实现的Rx.rb,⽤Python实现的RxPy,当然,还有这个⼤家族中最年长的Rx.NET。RxJS,也就是Rx的JavaScript语⾔实现。
Rx(包括RxJS)诞⽣的主要⽬的虽然是解决异步处理的问题,但并不表⽰Rx不适合同步的数据处理,实际上,使⽤RxJS之后⼤部分代码不需要关⼼⾃⼰是被同步执⾏还是异步执⾏,所以处理起来会更加简单。
RxJS 属于“函数响应式编程”。
函数响应式编程的优势
- 数据流抽象了很多现实问题。
- 擅长处理异步操作。
- 把复杂问题分解成简单问题的组合。
RxJS入门之函数响应式编程的更多相关文章
- 函数响应式编程(FRP)从入门到”放弃”——基础概念篇
前言 研究ReactiveCocoa一段时间了,是时候总结一下学到的一些知识了. 一.函数响应式编程 说道函数响应式编程,就不得不提到函数式编程,它们俩到底有什么关系呢?今天我们就详细的解析一下他们的 ...
- ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!
简介 项目主页: ReactiveCocoa 实例下载: https://github.com/ios122/ios122 简评: 最受欢迎,最有价值的iOS响应式编程库,没有之一!iOS MVVM模 ...
- 函数响应式编程(FRP)—基础概念篇
原文出处:http://ios.jobbole.com/86815/. 一函数响应式编程 说到函数响应式编程,就不得不提到函数式编程,他们俩有什么关系呢?今天我们就详细的解析一下他们的关系. 现在下面 ...
- 函数响应式编程及ReactiveObjC学习笔记 (-)
最近无意间看到一个视频讲的ReactiveObjC, 觉得挺好用的 但听完后只是了解个大概. 在网上找了些文章, 有的写的比较易懂但看完还是没觉得自己能比较好的使用RAC, 有的甚至让我看不下去 这两 ...
- 函数响应式编程(FRP)框架--ReactiveCocoa
由于工作原因,有段时间没更新博客了,甚是抱歉,只是,从今天開始我又活跃起来了,哈哈,于是决定每周更新一博.大家互相学习.交流. 今天呢.讨论一下关于ReactiveCocoa,这个採用函数响应式编程( ...
- 函数响应式编程(FRP)思想-Callback风格
序 ReactiveCocoa是IOS广为使用的技术框架,而ReactiveCocoa的核心思想就FRP.FRP不同于JAVA的object-oriented和AOP,FRP能让你的代码像数学一样简洁 ...
- 函数响应式编程RxJava
RxJava 到底是什么 一个词:异步. RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event- ...
- 函数响应式编程及ReactiveObjC学习笔记 (二)
之前我们初步认识了RAC的设计思路跟实现方式, 现在我们再来看看如果使用它以及它能帮我们做什么 One of the major advantages of RAC is that it provid ...
- 函数响应式编程及ReactiveObjC学习笔记 (三)
之前讲了RAC如何帮我们实现KVO / 代理 / 事件 / 通知 今天先不去分析它的核心代码, 我们先看看ReactiveObjC库里面一些特别的东西, 如果大家点开ReactiveObjC目录应该 ...
随机推荐
- discuz回贴通知插件实现-插件后台管理配置
1.登出discuz后台,再次设计插件 2.使用变量
- 一、消息队列之ActiveMQ的安装、配置和C#样例代码
最近有时间了,研究一下消息队列ActvieMQ,结合自己的实践和网上的一些大家内容,整理如下,所有步骤和链接均是正确的. 1.ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲 ...
- JMeter中用java修改文件名称
import java.io.File; String NewDataPath=bsh.args[0]; File SrcFile= new File(NewDataPath+"AutoTe ...
- Find one unique integer
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
- MySQL之安装以及辅助工具的安装
一 下载地址 MySQL 下载地址: http://rj.baidu.com/soft/detail/12585.html?ald 客户端工具:MavicatforMySQL 绿色版下载地址:http ...
- IC向管理者角色转换
1. 虽然你认为自己已经想明白怎么干,但还是从怎么干回归到要解决的问题,抛给正确的人(应该对这些问题负责的人),引导他们想出问题的答案. 给别人机会和空间,帮助他们成长: 人们对自己“想”出的方案更有 ...
- 2018.07.03 BZOJ 1007: [HNOI2008]水平可见直线(简单计算几何)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB Description 在xoy直角坐标平面上有n条直线L1,L2,-Ln, ...
- redis学习-有序集合(zset)常用命令
zadd:有序集合增加一个或者多个键值对 与set集合不同,zset添加的时候需要 指定 score,这个是用来排名的 zrange:返回指定范围的键 zcount:返回集合指定范围的个数(以每个键值 ...
- ImageResizer 3.4.3配置
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how ...
- Netty学习第五节实例进一步学习
概念理解: Netty是基于NIO的框架 传统IO与NIO的区别: 1.传统IO会造成阻塞点: 2.单一的客户端处理消息 解决阻塞问题:建立线程池,达到收到一个消息就建立一个 ...