【发布时间】:2018-03-24 02:27:30
【问题描述】:
所以我想设置一个仅在订阅时才获取数据的流。如果有多个订阅,那么我希望它进行多播以避免过多的 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>
原因似乎是它额外等待内部 observable 完成:
是否有更好的运算符(或运算符序列)来完成此操作?我宁愿避免重新创建 shareReplay 运算符只是为了删除该条件。
【问题讨论】:
-
看看这个blog.thoughtram.io/angular/2018/03/05/…。我认为它回答了你的观点。
-
@Picci 他们仍在使用
shareReplay。您在哪里看到它解决了我的问题? -
你是对的。它不会处理您的问题。很抱歉这个错误。
标签: rxjs