为什么我们将RxJS Subject称为多播而将Observable称为单播?

时间:2019-07-13 15:48:46

标签: angular rxjs observable

我从某个时候开始使用RxJS,我似乎不明白为什么我们将RxJS Subject称为Multicast,而将Observable称为Unicast

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

我是从RxJS官方网站上找到的

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

这是否意味着像一个普通的Observable不能有多个Observer?

1 个答案:

答案 0 :(得分:0)

考虑以下代码:

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是单播的,因为每个观察者都有自己的数据生产者实例。另一方面,如果每个观察者都从同一生产者接收到通知,则可以观察到多播,如下所示:

    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

最后一个代码段未考虑错误和补全之类的处理方法。

由于this,该主题是多播的:

  

在主题内部,订阅不会调用新的执行   提供价值。它只是将给定的Observer注册在列表中   的观察者,类似于addListener通常在其他观察者中的工作方式   图书馆和语言。

花点时间阅读this