什么是Observer? Observer(观察者)是Observable(可观察对象)推送数据的消费者。在RxJS中,Observer是一个由回调函数组成的对象,键名分别为next
、error
和 complete
,以此接受Observable推送的不一样类型的通知,下面的代码段是Observer的一个示例:数组
var observer = { next: x => console.log('Observer got a next value: ' + x), error: err => console.error('Observer got an error: ' + err), complete: () => console.log('Observer got a complete notification'), };
调用Observer逻辑,只需在subscribe
(订阅)Observable后将Observer传入:函数
observable.subscribe(observer);
在RxJS中,Observer是可选的。在next
、error
和 complete
处理逻辑部分缺失的状况下,Observable仍然能正常运行,为包含的特定通知类型的处理逻辑会被自动忽略。code
下面例子中Observer并不包含complete
类型通知的处理逻辑:server
var observer = { next: x => console.log('Observer got a next value: ' + x), error: err => console.error('Observer got an error: ' + err), };
在订阅Observable时,你甚至能够把回调函数做为参数传入,而不是传入完整的Observer对象:对象
observable.subscribe(x => console.log('Observer got a next value: ' + x));
在RxJS内部,调用observable.subscribe
时,它会建立一个只有next
处理逻辑的Observer。固然你也能够将next
、error
和 complete
的回调函数分别传入:ip
observable.subscribe( x => console.log('Observer got a next value: ' + x), err => console.error('Observer got an error: ' + err), () => console.log('Observer got a complete notification') );
什么是Subscription? Subscription是一个表明能够终止资源的对象,表示一个Observable的执行过程。Subscription有一个重要的方法:unsubscribe
。这个方法不须要传入参数,调用后便会终止相应的资源。在RxJS之前的版本中,Subscription被称为"Disposable"。资源
var observable = Rx.Observable.interval(1000); var subscription = observable.subscribe(x => console.log(x)); subscription.unsubscribe();
Subscription可以经过unsubscribe()
函数终止Observable的执行过程并释放相应资源。rem
Subscription能够嵌套使用:你能够调用一个Subscription的unsubscribe()
方法来取消一系列嵌套的Subscription。经过add
方法,即可以实现Subscription的嵌套:回调函数
var observable1 = Rx.Observable.interval(400); var observable2 = Rx.Observable.interval(300); var subscription = observable1.subscribe(x => console.log('first: ' + x)); var childSubscription = observable2.subscribe(x => console.log('second: ' + x)); subscription.add(childSubscription); setTimeout(() => { // 终止全部嵌套的Subscription subscription.unsubscribe(); }, 1000);
执行后,控制台会输出一下结果:io
second: 0 first: 0 second: 1 first: 1 second: 2
此外,Subscription提供了remove(otherSubscription)
方法,能够删除一个Subscription嵌套的子Subscription。