gpt4 book ai didi

javascript - 为什么订阅在首次订阅热门可观察对象后没有触发

转载 作者:行者123 更新时间:2023-12-03 01:43:42 24 4
gpt4 key购买 nike

在我的代码中,我使用 share() 创建了一个热 observable ,如果我没有完成 observable ,或者使用 setTimeout 使其异步,则仅执行第一个订阅,之后的任何其他订阅都不会执行。这是预期的行为吗?

const c=Rx.Observable.create((obs)=>{
obs.next(1)
// add this will work
// setTimeout(()=>obs.next(1),1000)
// add this will work too
// obs.complete()
}).share()

// excuted
c.subscribe(()=>console.log('first subscribe'))
// not excuted
c.subscribe(()=>console.log('second subscribe'))

如果我使用发布连接方法,它会按预期工作。

const c=Rx.Observable.create((obs)=>{
obs.next(1)
}).publish()

// excuted
c.subscribe(()=>console.log('first subscribe'))
// excuted
c.subscribe(()=>console.log('second subscribe'))
c.connect()

jsfiddle

最佳答案

让我们一步一步地看一下这个例子。

Rx.Observable.create((obs)=>{
obs.next(1)
})

这会创建一个可观察对象,并且在请求订阅时执行您传递给 create 的函数。

.share()

这共享上游订阅。这意味着第一个订阅者使 share 创建对源的订阅,并且所有后续订阅者共享(原文如此!)此订阅。如果所有订阅者都取消订阅,则对源的订阅也会被取消。请注意,当流之前完成时,也会创建一个新的订阅。

c.subscribe(()=>console.log('first subscribe'))

第一个订阅者订阅,share 运算符创建共享订阅。因此,订阅函数被执行并发出一个值。

c.subscribe(()=>console.log('second subscribe'))

第二个订阅者进行订阅,share 运算符(operator)重新使用现有的源订阅。因此,订阅函数不会执行,并且不会发出任何值。

如果您将 .unsubscribe() 添加到第一个 subscribe ,那么它将按您的预期工作,因为共享订阅被取消,第二个订阅者会导致另一个订阅者执行订阅功能。

关于javascript - 为什么订阅在首次订阅热门可观察对象后没有触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50734907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com