如何创建一个仅在有订阅者时触发并立即为新订阅者提供最新值的 Observable
How to create an Observable that only fires when it has subscribers, and provides the latest value to new subscribers immediately
我正在尝试创建一个 stream/observable...
- 仅在有订阅者时输出事件
- 为所有新订阅者提供最新值。
具体情况是我需要一个 Observable,它在特定事件发生时进行异步 API 调用,但前提是它有订阅者。我正在努力避免不必要的 API 电话。
我已经成功地创建了一个只有在有这样的订阅者时才会触发的流...
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
这行得通。如果我在 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
。
如果我的理解是正确的话。我需要 Hot Observable。所以我尝试创建这样的流...
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
成为 hot observable
。
但是,在我的测试中,第二个订阅在下一个时间间隔之前仍然收不到数据。此外,这将引入在订阅时连接和断开数据流的要求,这是我希望尽可能避免的事情。
我是 RxJS 的新手,如果我误解了这里发生的事情,我不会感到惊讶。
而不是 .publish()
,使用 .shareReplay(1)
。
我正在尝试创建一个 stream/observable...
- 仅在有订阅者时输出事件
- 为所有新订阅者提供最新值。
具体情况是我需要一个 Observable,它在特定事件发生时进行异步 API 调用,但前提是它有订阅者。我正在努力避免不必要的 API 电话。
我已经成功地创建了一个只有在有这样的订阅者时才会触发的流...
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
这行得通。如果我在 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
。
如果我的理解是正确的话。我需要 Hot Observable。所以我尝试创建这样的流...
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
成为 hot observable
。
但是,在我的测试中,第二个订阅在下一个时间间隔之前仍然收不到数据。此外,这将引入在订阅时连接和断开数据流的要求,这是我希望尽可能避免的事情。
我是 RxJS 的新手,如果我误解了这里发生的事情,我不会感到惊讶。
而不是 .publish()
,使用 .shareReplay(1)
。