为什么我们称 RxJS 主题为多播,将 Observable 称为单播?

问题描述 投票:0回答:3

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

RxJS Subject
称为
Multicast
Observable
Unicast

我了解到

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

我从RxJS官网找到这个

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

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

angular rxjs observable
3个回答
27
投票

考虑这段代码:

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

最后一个代码片段没有考虑错误和完成等一些处理。

Subject
是多播的,因为 this:

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

花一些时间阅读


2
投票

很简单,可观察量是单播意味着当我们订阅它时,它只是创建一个传递值的新执行 而主题是多播意味着当我们订阅它时,它不会调用传递值的新执行


0
投票

我们将 RxJs 主题称为多播,因为它向所有订阅者共享相同的可观察对象(数据生产者),这意味着它与所有订阅者共享数据

Observables 有数据生产者(Observable)和数据接收者(订阅者)两部分。在 Observable 中,每个订阅者都拥有独立执行的 observable,因此它不会向所有订阅者共享相同的值。

单播:每个订阅都拥有独立执行的 observable,它将通知传递给单个订阅。 多播:它共享 Observable 的执行,并将通知传递给所有订阅者。

© www.soinside.com 2019 - 2024. All rights reserved.