【问题标题】:Why do we call RxJS Subject as Multicast and Observable as Unicast?为什么我们称 RxJS 的 Subject 为 Multicast 而 Observable 为 Unicast?
【发布时间】:2019-07-13 15:48:46
【问题描述】:

我从某个时候开始使用 RxJS,我似乎无法理解为什么我们将 RxJS Subject 称为 MulticastObservable 称为 Unicast

我知道Subject 能够使用next() 发出数据,并且像普通的 Observable 一样,我们也可以订阅它们。

我是从 RxJS 官网找到的

A Subject is like an Observable, but can multicast to many Observers. 

这是否意味着一个普通的 Observable 不能有多个观察者?

【问题讨论】:

  • 是的。一个主题向许多订阅者发出相同的事件。一个冷的 observable 为每个订阅者生成一个新的事件流。 rxjs-dev.firebaseapp.com/guide/subject
  • 主题也可以作为 Observable 使用 asObservable 方法返回,然后您将获得反映主题的多播 observable,但没有 next 公开以供外部使用。所以是的,一个可观察的可以多播。主体和可观察对象都可以有多个观察者,但多播可以向其观察者发出多次,而单播将向其观察者发出一次。

标签: angular rxjs observable


【解决方案1】:

考虑这段代码:

const myObservable = new Observable<number>(subscriber => {
    const rdn = Math.floor(Math.random() * 200) + 1;
    subscriber.next(rdn);
});
myObservable
    .subscribe(a => console.log('Subscription A', a));
myObservable
    .subscribe(a => console.log('Subscription B', a));
    
// Result: 
// Subscription A 137
// Subscription B 8

Observable 是单播的,因为每个观察者都有自己的数据生产者实例。另一方面,如果每个观察者都收到来自同一个生产者的通知,则 Observable 是多播的,如下所示:

const rdn = Math.floor(Math.random() * 200) + 1;
const myObservable = new Observable<number>(subscriber => {
  subscriber.next(rdn);
});
myObservable
  .subscribe(a => console.log('Subscription A', a));
myObservable
  .subscribe(a => console.log('Subscription B', a));

// Result:
// Subscription A 149
// Subscription B 149

最后一段代码 sn-p 没有考虑错误和完成等处理。

Subject 是多播因为this

在 Subject 内部,订阅不会调用新的执行 传递价值。它只是在列表中注册给定的观察者 观察者,类似于 addListener 通常在其他中的工作方式 库和语言。

花点时间阅读this

【讨论】:

  • 很好的解释,比角度文档好得多,谢谢!
  • 我可以说,Observable 就像 OTT 一样,每个人(订阅者)都可以通过 OTT 平台(生产者)获得他们自己版本的内容。主题就像直播电视节目,每个人(订阅者)都可以通过广播公司(制作人)看到相同的内容。
猜你喜欢
  • 2017-08-22
  • 2018-05-12
  • 2016-09-27
  • 2016-05-07
  • 1970-01-01
  • 2017-06-22
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多