《深入浅出RxJS》

rxjs的引入 // 如果以这种方式导入rxjs,那么整个库都会导入,我们一般不可能在项目中运用到rxjs的所有功能 const Rx = require('rxjs');

解决这个问题,可以使用深链deep link的方式,只导入用的上的功能

import {Observable} from 'rxjs/Observable';

这样可以减少不必要的依赖,不光可以优化打包文件的大小,还有利于代码的稳定性

另外目前最新的一种解决方案就是Tree Shaking, Tree Shaking只对import语句导入产生作用,对require不起作用。因为tree shaking的工作方式是对代码静态分析,import只能出现在代码的第一层,不能出现在if分支中。而require可以出现在if分支中,参数也是可以动态产生的字符串,所以只能动态执行时才知道require函数式如何执行的,这里Tree Shaking就不起作用了。

rxjs中Tree Shaking不起作用

实际项目中,如果不会使用很多RxJS的功能,建议还是避免导入全部RxJS的做法,使用npm导入然后通过打包工具来组合

Observer的完结

为了让Observable有机会告诉Observer已经没有更多数据了,需要有另外一种通信机制。在Rxjs中,实现这种通信机制的就是Observer的complete函数

如果你没法预测你的程序会不会出现异常,那么就需要使用error参数,如果不需要可以直接给个Null作为第二个参数

const theObserver = { next: item => console.log(item), null, complete: () => console.log('No More Data') };

何时完结这个Observable对象需要Observable主动调用complete()
在Observable发生error之后,不再会调用后面的complete().因为在一个Observable对象中,要么是完结状态,要么是出错状态。一旦进入出错那么就终结了。

Observable 可观察的对象
Observer 观察者
联系两者的桥梁就是subscribe
在Rxjs中,发布者就是Observable,观察者就是subscribe函数,这样就可以吧观察者和发布者联系起来

如何取消订阅 const Observable = Rx.Observable; const onSubscribe = observer => { let number = 1; const handle = setInterval(() => { observer.next(number++); }, 1000); return { unsubscribe: () => { clearInterval(handle); } }; }; const source$ = new Observable(onSubscribe); const subscription = source$.subscribe(item => console.log(item)); setTimeout(() => { subscription.unsubscribe(); }, 3500);

Observable产生的事件,只有Observer通过subscribe订阅之后才会收到,在unsubscribe之后就不再收到

Hot Observable和Cold Observable

如果一个Observable对象同时有多个Observer订阅,如果A在B之前订阅,那么B该不该订阅到错过的那些数据流。
如果错过就错过了那么这样的Observable成为Hot,但是如果B仍然从头开始订阅这个Observable那么这样的成为Cold

如果每次订阅的时候, 已经有⼀个热的“⽣产者”准备好了, 那就是Hot Observable, 相反,如果每次订阅都要产⽣⼀个新的⽣产者, 新的⽣产者就像汽车引擎⼀样刚启动时肯定是冷的, 所以叫Cold Observable

复杂的问题可以被分解为三个小问题

如何产生事件

如何响应事件

什么样的发布者关联什么样的观察者,也就是何时调用subscribe

Observable产生的事件,只有Observer通过subscribe订阅之后才会收到,在unsubscribe之后就不会收到
Observable.create()用来创建一个Observable对象
在RXJS中,和数组的map一样,作为操作符的map也接受一个函数参数,不同之处是,对于数组的map,是把每个数组元素都映射为一个新的值,组合成一个新的数组

操作符分类

创建类(creation)

转化类(transformation)

过滤类(filtering)

合并类(combination)

多播类(multicasting)

错误处理类(error Handling)

辅助⼯具类(utility)

条件分⽀类(conditional&boolean)

数学和合计类(mathmatical&aggregate)

静态操作符的导入路径rxjs/add/observable/
实例操作符的导入路径rxjs/add/operator/
在链式调用中,静态操作符只能出现在首位,实例操作符则可以出现在任何位置。

Tree Shaking帮不上Rxjs什么忙,因为Tree Shaking只能做静态代码检查,并不是程序运行时去检测一个函数是否真的被调用、只有一个函数在任何代码中都没有引用过,才会认为这个函数不会被引用。但是RxJS任何一个操作符都是挂在Observable类或者Observable.prototype上的, 赋值给Observable或者Observable.prototype上某个属性在Tree Shaking看来就是被引⽤, 所以, 所
有的操作符, 不管真实运⾏时是否被调⽤, 都会被Tree Shaking认为是会⽤到的代码, 也就不会当做死代码删除。

退订资源的基本原则:当不再需要某个Observable对象获取数据的时候,就要退订这个Observable对象
在对上游的数据处理中,利用try...catch...的组合捕获project调用的可能的错误,如果真的有错误,那就调用下游的error函数

const sub = this.subscribe({ next: value => { try{ observer.next(project(value)) }catch(err) { observer.error(err); } }, error: err => observer.error(err), complete: () => observer.complete() }); 关联Observable

给Observable打补丁

这种方式比较简单,可以直接绑定在prototype上,如果是静态属性直接绑定在类上面

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzyxwy.html