我从某个时候开始使用 RxJS,我似乎无法理解为什么我们将
RxJS Subject
称为 Multicast
和 Observable
为 Unicast
。
我了解到
Subject
能够使用 next()
发出数据,并且像普通 Observable 一样,我们也可以订阅它们。
我从RxJS官网找到这个
A Subject is like an Observable, but can multicast to many Observers.
这是否意味着普通的 Observable 不能有多个观察者?
考虑这段代码:
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 通常在其他中的工作方式 图书馆和语言。
花一些时间阅读此。
很简单,可观察量是单播意味着当我们订阅它时,它只是创建一个传递值的新执行 而主题是多播意味着当我们订阅它时,它不会调用传递值的新执行
我们将 RxJs 主题称为多播,因为它向所有订阅者共享相同的可观察对象(数据生产者),这意味着它与所有订阅者共享数据
Observables 有数据生产者(Observable)和数据接收者(订阅者)两部分。在 Observable 中,每个订阅者都拥有独立执行的 observable,因此它不会向所有订阅者共享相同的值。
单播:每个订阅都拥有独立执行的 observable,它将通知传递给单个订阅。 多播:它共享 Observable 的执行,并将通知传递给所有订阅者。