学习是一个由浅入深的过程,如果能够理解并掌握二八原则(帕累托法则),那么我们对知识的学习定会事半功倍,甚至事半多倍。
RxJs定义
RxJS是ReactiveX在JavaScript上的一个派生。ReactiveX是一个应用比较广泛的响应式编程框架,这个框架很好的应用了Observer Pattern(观察者模式),让异步编程变得简单且清晰
理解Observable
Observable的简单理解是:它是一个可观察对象,可以被订阅;它接收一个函数。(如何深入理解可观察对象请查看链接)
以上理解可以看出:Observable有一个接收函数的构造器,它也有一个订阅方法。我们尝试定义一个吧。
let observerNumber = 0; //为了后文说明RxJs的调用实际上就是一些Observable对象的链接。
export class MyObservable {
//私有函数变量,用于触发订阅逻辑的执行
_subscribe;
constructor(subscribe) {
this._subscribe = subscribe;
observerNumber++;
}
subscribe(observer) {
//这里的注释部分用于处理subscribe接收函数的情景
// const defaultObserver = {
// next: () => { },
// error: () => { },
// complete: () => { }
// }
// if (typeof observer === 'function') {
// return this._subscribe({ ...defaultObserver, next: observer });
// } else {
// return this._subscribe({ ...defaultObserver, ...observer });
// }
return this._subscribe(observer);
}
print() {
console.log('observerNumber:',observerNumber);
}
}
通过上面代码和注解,我们可以看出,Observable
的订阅方法接收一个对象,这个对象有三个方法:next,error,complete
,但是我们平时的使用中,我们知道这个方法也可以接收一个函数。注释部分的代码就是Observable的订阅方法接收函数的情形。(注意,这里的本质上就是将函数复制到一个defaultObserver
,然后启动执行)
下面我们来尝试调用一下:
const myObservable =new MyObservable(observer=>{
observer.next(1);
setTimeout(() => {
observer.next(2);
observer.complete();
}, 1000)
observer.next(3);
});
const observer = {
next: x => console.log(x),
error: err => console.error(err),
complete: () => console.log('done'),
}
myObservable.subscribe(observer);
可以看出,我这个自定义的Observable对象,起到了官方代码Observable的作用。从定义和执行可以看出,当执行
myObservable.subscribe(observer);
这行代码时,实际上是将这个对象传递给被订阅的Observable对象的构造器的参数函数进行执行;也就是说这里的参数Observer实际上是传递给
看我标注蓝色部门的这个函数,实际上是给这个函数执行,且参数刚好是构造器的参数函数的参数。比如这里执行
observer.next(1);
这行代码的时候,实际上执行的是
const observer = {
next: x => console.log(x),
error: err => console.error(err),
complete: () => console.log('done'),
}
上面对象的next方法,这里的参数是1,因此执行控制台打印出1这个值。后面的执行同理按此进行分析。
如果Observable的subscribe方法是一个函数,只需要将这个函数覆盖掉原始对象的next方法就可以啦。感兴趣的可以试着分析一下。
总结一下
1、Observable是一个构造器接收函数参数的类。
2、Observable有一个subscribe方法,这个方法可以接收一个函数或者一个对象作为参数,且这个对象一定有三个方法next,error,complete。
3、Observabel执行subscribe方法的时候,启动整个运算,且subscribe方法的参数刚好是Observabel的构造器对应函数的输入参数。