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函数,这样就可以吧观察者和发布者联系起来
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函数
给Observable打补丁
这种方式比较简单,可以直接绑定在prototype上,如果是静态属性直接绑定在类上面