Javascript 如何创建一个Observable,它只在有订阅者时触发,并立即向新订阅者提供最新的值
我正在尝试创建一个流/可观察到的Javascript 如何创建一个Observable,它只在有订阅者时触发,并立即向新订阅者提供最新的值,javascript,rxjs,frp,reactive-extensions-js,Javascript,Rxjs,Frp,Reactive Extensions Js,我正在尝试创建一个流/可观察到的 仅在有订阅服务器时输出事件 为所有新订阅服务器提供最新值 具体的情况是,我需要一个observable,它在特定事件发生时进行异步API调用,但前提是它有订阅者。我试图避免不必要的API调用 我已经设法创建了一个流,只有当它有这样的订户时才会触发 let dataStream = Rx.Observable .interval(1000) // Fire an event every second .singleInstance() // Only
let dataStream = Rx.Observable
.interval(1000) // Fire an event every second
.singleInstance() // Only do something when we have subscribers
.startWith(null) // kick start as soon as something subscribes
.flatMapLatest(interval => SomeAPI.someDataGet()) // get data, returns a promise
let dataStream = Rx.Observable
.interval(1000) // Fire an event every second
.singleInstance() // Only do something when we have subscribers
.startWith(null) // kick start as soon as something subscribes
.flatMapLatest(interval => SomeAPI.someDataGet()) // get data
.publish() // Make this a hot observable;
这是有效的。如果我在SomeAPI.someDataGet
方法中console.log(…)
,我只看到它在流有订阅者时启动。我的实现看起来非常好,因为我这样做是为了订阅和取消订阅,这非常适合React组件生命周期方法
let sub1;
sub1 = dataStream.subscribe(x => console.log('sub1', x));
sub1.dispose();
我还希望任何新订户在订阅时立即收到最新的价值。这就是我挣扎的地方。如果我这样做
let sub1, sub2;
sub1 = dataStream.subscribe(x => console.log('sub1', x));
setTimeout( () => {
sub2 = dataStream.subscribe(x => console.log('sub2', x));
}, 1500)
…直到下一个时间间隔,我才看到sub2的console.log
如果我的理解是正确的。我需要一张支票。所以我试着创建一个像这样的流
let dataStream = Rx.Observable
.interval(1000) // Fire an event every second
.singleInstance() // Only do something when we have subscribers
.startWith(null) // kick start as soon as something subscribes
.flatMapLatest(interval => SomeAPI.someDataGet()) // get data, returns a promise
let dataStream = Rx.Observable
.interval(1000) // Fire an event every second
.singleInstance() // Only do something when we have subscribers
.startWith(null) // kick start as soon as something subscribes
.flatMapLatest(interval => SomeAPI.someDataGet()) // get data
.publish() // Make this a hot observable;
据我所知,这应该使dataStream
ahot observable
然而,在我的测试中,第二个订阅直到下一个间隔才接收数据。此外,这将引入在订阅时连接和断开数据流的要求,这是我希望尽可能避免的
我是RxJS的新手,如果我误解了这里发生的事情,我不会感到惊讶。如果你知道怎么做,请使用.shareReplay(1)
而不是.publish()
。谢谢