为什么Observable可被两个观察者订阅两次,不是Subject才能被多播吗?

发布于 2022-09-04 08:43:00 字数 347 浏览 19 评论 0

来自官方文档的额例子图片描述

来自官方关于Subject多播的介绍:A "multicasted Observable" passes notifications through a Subject which may have many subscribers, whereas a plain "unicast Observable" only sends notifications to a single Observer.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

执笏见 2022-09-11 08:43:00

一个 Observable 是可以被多个 observer 订阅的,只是每个订阅都是一个新的独立的 Observable execution :

each subscribed Observer owns an independent execution of the Observable

可以看下面例子:http://jsbin.com/fufajukutu/1...

const { Observable } = Rx


const clock$ = Observable.interval(1000).take(3);

const observerA = {
  next(v) {
    console.log('A next: ' + v)
  }
}
const observerB = {
  next(v) {
    console.log('B next: ' + v)
  }
}

clock$.subscribe(observerA) // a Observable execution

setTimeout(() => {
  clock$.subscribe(observerB) // another new Observable execution
}, 2000)

/*
 * A next: 0
 * A next: 1
 * A next: 2
 * B next: 0
 * B next: 1
 * B next: 2
 */

如果是同一个 shared Observable execution 的话,B的第一个 emit 的值应该是 2 而不是 0 ,并且只有且仅有一个值 2
下面是用 Subject 写的例子:http://jsbin.com/fufajukutu/2...

const { Observable, Subject } = Rx


const clock$ = Observable.interval(1000).take(3);

const observerA = {
  next(v) {
    console.log('A next: ' + v)
  }
}
const observerB = {
  next(v) {
    console.log('B next: ' + v)
  }
}
const subject = new Subject()
subject.subscribe(observerA)

clock$.subscribe(subject)

setTimeout(() => {
  subject.subscribe(observerB)
}, 2000)

/*
 * A next: 0
 * A next: 1
 * A next: 2
 * B next: 2
 */

由于 Subject 是多播,也就是每个 observer 都 share 同一个 Observable execution 。
所以B的第一个 emit 的值并且只有一个值是 2

See Also

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文