Rxjs响应式编程

关于Rxjs的现状

鉴于响应式编程近几年才开始真正流行,而且响应式的理念也并不是在所有领域都深得人心,对于不是特别喜欢追求新概念新技术的公司或程序员来说,不排除有确实没听说过的可能。

对于听说过的人来说,可能也并不是都理解响应式编程的理念,可能只是把 Rx 当成和 Promise、Async 类似的用来替代 Callback 的异步方案,但是可能自己的需求用 Promise 等已经足够解决,所以没有足够的意愿和时间来了解 Rx。

对于了解 Rx 的响应式编程及其优势的人来说,可能出于实际项目中团队合作的需要,并不经常能够使用 Rx。并且目前大部分类库还是基于回调或者 Promise 的,要使用 Rx 的话需要一些胶水代码来封装,对于异步逻辑不是足够复杂的可能在 Glue 上也需要一些额外的成本。

对于用 ES5 的开发人员来说,由于没有 Lambda 所以 Rx 在写法上可能也较为复杂。

Rx 的一个问题就是它其实是一个 paradigm,侵入性很强。你如果要用 Rx 写东西,最好就整个系统都是以 Rx 为核心来设计。(比如 Cycle.js)对于已经用传统范式开发了一定时间的项目来说,引入 Rx 会比较尴尬。

另外单就前端来说,很多场景并没有复杂到需要 Rx,这种时候用 Rx 反而成本变高了。

Rxjs是什么

RxJS全名Reactive Extensions for JavaScript : Javascript的响应式扩展
Rxjs是一个基于JavaScript的库
还有支持其他语言的库,比如:Rxjava

什么是响应式编程(RP: Reactive programming)

响应式的思路:是把随时间不断变化的数据、状态、事件等等转成可被观察的序列(Observable Sequence),然后订阅序列中那些Observable对象的变化,一旦变化,就会执行事先安排好的各种转换和操作。
响应式编程是使用异步数据流进行编程

由谁发明的?

微软出品

为什么要使用(它解决了什么问题)

有人这样说 :

RxJS是一个解决异步问题的JS开发库.它起源于 Reactive Extensions 项目,它带来了观察者模式和函数式编程的相结合的最佳实践.观察者模式是一个被实践证明的模式,基于生产者(事件的创建者)和消费者(事件的监听者)的逻辑分离关系.

知乎上这样说:

RxJS/Cycle.js解决的是数据流的问题,为什么有数据流的问题,是因为更倾向于或者受限于使用单向数据绑定,核心其实解决的是State管理的问题。偏向于Redux或者Flux架构会有全局State的困扰

Rxjs的原理,核心

Rxjs核心概念之Observable
对观察者模式的实现才是Rxjs的核心,但这仅仅是RxJS旅程的开始,丰富的扩展 才是RxJS的威力所在。
Observable(可观察对象)是基于推送(Push)运行时执行(lazy)的多值集合

就 RxJS 来说,可以把 JavaScript 工程师分为以下几个层次:

没听说过 RxJS 的;
听说过但是不会的;
会的但是不常用的;
会的并且经常用的。

下面就来说说说它的用法

Rxjs的用法

RxJS的基本用法:
Rx.Observable.*创建一个Observable对象当它发生变化时,以流式的方式触发各种转换(如有需要可以对变化的值做合并、映射、过滤等操作),最后传到订阅回调拿到处理后的最终结果。

  • 数据的转换

Rxjs将数据分为两种类型:

  • 普通数据 - 比如:数组,字符串,json对象之类的
  • 可观测对象 - 比如使用Rx.Observable.create()方法获得的对象


    数据转换的过程

就像普通数据可以进行加、减、乘、除等运算一样,RxJS提供了相当多的 扩展方法来扩展对Observable对象的操作能力。
比如你可以使用from()方法将普通的数据变换到Observable域,或者 使用to()方法将Observable还原为普通数据:

var a = Rx.Observable.from([1,2,3,4]); 
var b = a.toArray();
  • create()方法的使用

使用create方法从零开始创建一个可观测序列/Observable
create方法的参数是一个封装数据生成逻辑的函数,其参数为观测者/Observer

var generator = function(observer){
    //数据生成逻辑
}
Rx.Observable.create(generator);

在函数generator的实现中,通过调用参数对象observer的三个方法,实现数据 的生成、错误的通知和结束声明:

  • onNext(data)* - 向观测者传送新的数据data

  • onError(err)* - 通知观测者有错误发生,并且终止当前序列

  • onCompleted()* - 通知观测者当前序列已结束

  • 简单扩展方法的使用:

或者将多个可观测对象使用concat()方法拼接起来:

//a:1 2 3 
//b: 4 5 6
//c: 7 8 9 
a.concat(b,c); //结果: 1 2 3 4 5 6 7 8 9

或者对Observable对象生成的数据使用sum()方法求和:

//a: 1 2 3
a.sum(); //结果:6

或者对Observable对象生成的每个数据进行映射处理:

//a: 1 2 3
a.map(function(d,i){ return d*10 }) //结果: 10 20 30

这些扩展的方法,RxJS称之为操作符/Operator,一个操作符通常返回的 是另一个新的Observable对象,这意味着它还处于Observable域,从而 可以将多个操作符链接起来,构成一条对Observable进行处理的流水线:

Rx.Observable.of(1,2,3)                 // 1 2 3
    .map(function(d){ return d*10;})    // 10 20 30 
    .concat(Rx.Observable.from([4,5,6])) // 10 20 30 4 5 6
    .subscribe(
        function(d){ console.log(d);},
        function(e){ console.log(e);},
        function(){ console.log("done");}
    )
参考学习网址:

官网
segmentfault- Observable
segmentfault- Subject

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容