所以我想设置一个只在订阅时才能获取数据的流。如果有多个订阅,那么我希望它进行多播以避免过多的api调用并缓存最后一次已知的商品,以便将来的订阅者可以获得数据而无需点击api。当有人订阅时,我希望在一段时间内刷新数据。
我尝试使用shareReplay(n)
运算符完成所有这些操作。它做了我想要的一切,除了当每个人都取消订阅时,它不会取消订阅计时器(refCount === 0
)。见下面的例子:
const subscription = Rx.Observable.timer(0, 1000)
.do((x) => { console.log('timer 1', x); })
.switchMap(() => {
console.log('call the api');
return Rx.Observable.of('my api call');
})
.shareReplay(1)
.do((x) => { console.log('timer 2'); })
.subscribe(
(x) => { console.log('data', x); }
);
setTimeout(() => {
console.log('unsubscribe');
subscription.unsubscribe();
}, 2500);

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.7/Rx.min.js"></script>
&#13;
原因似乎是它还等待内部可观察者完成:
是否有更好的运算符(或运算符序列)用于实现此目的?我宁愿避免重新创建shareReplay
运算符以删除该条件。
答案 0 :(得分:1)
在发布后发现,publishReplay(1).refCount()
执行我所描述的内容。我将这个问题留给那些陷入困境的其他人。
因此publishReplay(1).refCount()
与shareReplay()
不同。它看起来像是从5.4.0到5.5.0-beta4。显然这是一个错误,这里是相关的pr:https://github.com/ReactiveX/rxjs/pull/2910
我不是唯一迷茫的灵魂: https://github.com/ReactiveX/rxjs/issues/3034