RxJS5订阅和观察者之间的区别

时间:2017-01-31 03:53:23

标签: rxjs5

我看到一些与Rx订阅/观察者相关的问题/答案,但它们可能适用于较旧版本的Rx,也不适用于RxJS,后者可能符合不同的API。

我的印象是订阅/订阅者和观察者都是一样的。如果您查看文档,它们位于不同的相邻部分,但似乎完全相同:

观察: http://reactivex.io/rxjs/manual/overview.html#observer

订阅: http://reactivex.io/rxjs/manual/overview.html#subscription

差点到底是什么?有人可以给出一个两者之间存在实际差异的例子吗?

2 个答案:

答案 0 :(得分:2)

  

Observer是Observable提供的值的消费者。

所以基本上观察者会接收流发出的值。

  

订阅是一个表示可支配资源的对象,通常是执行Observable。

订阅基本上只是某个观察者当前接收数据的“fact”,如果您取消订阅订阅,则流和观察者仍将存在,它们不再连接

与伪代码混合的现实世界隐喻:报纸

:这将是报纸的生产链(涉及出版公司创建内容和印刷厂打印纸张

const newsPaper$ = Observable.interval(DAILY)
    .switchMapTo(date => publishingCompany.createContent(date))
    .switchMapTo(content => printingHouse.printPaper(content))
    .publish()
    .refCount();

观察者:这将是读者/收件人,带浴袍的男人每天早上在他的前院拿起报纸阅读。

const bathrobeGuy = {
    next: newsPaper => readPaper(newsPaper),
    error: errorMsg => complainAbout(errorMsg), // the bathrobe guy will be so angry, the he unsubscribes the paper
    complete: () => subscribeToDifferentNewsPaper()
}

订阅:这是新闻纸订阅 - 送货员每天早上将报纸扔进每个前院。

// this will activate the "delivery boy"
const paperSubscription = newsPaper$.subscribe(bathrobeGuy);

取消订阅:当浴衣人决定不再需要纸张时,他可以取消订阅纸张,送货员不再送纸。然而观察者(浴衣人)和报纸制作仍然存在,但他们已经没有任何关系了。

paperSubscription.unsubscribe();

答案 1 :(得分:1)

Observer 是一个对象,其中包含一组在订阅Observable时执行的回调。换句话说,当你调用subscribe时,你传递了一个Observer类型的对象。即使您只传递回调,内部rxjs也会创建一个Observer,其回调为next属性。其他属性为errorcomplete

订阅是来电return的{​​{1}}类型,其唯一目的是能够拨打subscribe以便不收听那个订阅了。

将不再调用Observer函数(next,error,complete)
subscription.unsubscribe()