我看到一些与Rx订阅/观察者相关的问题/答案,但它们可能适用于较旧版本的Rx,也不适用于RxJS,后者可能符合不同的API。
我的印象是订阅/订阅者和观察者都是一样的。如果您查看文档,它们位于不同的相邻部分,但似乎完全相同:
观察: http://reactivex.io/rxjs/manual/overview.html#observer
订阅: http://reactivex.io/rxjs/manual/overview.html#subscription
差点到底是什么?有人可以给出一个两者之间存在实际差异的例子吗?答案 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
属性。其他属性为error
和complete
。
订阅是来电return
的{{1}}类型,其唯一目的是能够拨打subscribe
以便不收听那个订阅了。
subscription.unsubscribe()