RxJS 中心观点Observer & Subscription

Observer(视察者)

什么是Observer? Observer(视察者)是Observable(可视察对象)推送数据的消费者。在RxJS中,Observer是一个由回调函数构成的对象,键名离别为nexterrorcomplete,以此接收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是可选的。在nexterrorcomplete处置惩罚逻辑部份缺失的情况下,Observable依然能一般运转,为包括的特定关照范例的处置惩罚逻辑会被自动疏忽。

下面例子中Observer并不包括complete范例关照的处置惩罚逻辑:

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。固然你也可以将nexterrorcomplete的回调函数离别传入:

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? 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的实行历程并开释响应资本。

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);

实行后,控制台会输出一下效果:


second: 0
first: 0
second: 1
first: 1
second: 2

另外,Subscription供应了remove(otherSubscription)要领,可以删除一个Subscription嵌套的子Subscription。

    原文作者:mumuzhenzhen
    原文地址: https://segmentfault.com/a/1190000005059624
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞