订阅时间隔调用API

时间:2018-03-22 15:57:39

标签: rxjs

所以我想设置一个只在订阅时才能获取数据的流。如果有多个订阅,那么我希望它进行多播以避免过多的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;
&#13;
&#13;

原因似乎是它还等待内部可观察者完成:

https://github.com/ReactiveX/rxjs/blob/b25db9f369b07f26cf2fc11714ec1990b78a4536/src/internal/operators/shareReplay.ts#L45

是否有更好的运算符(或运算符序列)用于实现此目的?我宁愿避免重新创建shareReplay运算符以删除该条件。

1 个答案:

答案 0 :(得分:1)

在发布后发现,publishReplay(1).refCount()执行我所描述的内容。我将这个问题留给那些陷入困境的其他人。

因此publishReplay(1).refCount()shareReplay()不同。它看起来像是从5.4.05.5.0-beta4。显然这是一个错误,这里是相关的pr:https://github.com/ReactiveX/rxjs/pull/2910

我不是唯一迷茫的灵魂: https://github.com/ReactiveX/rxjs/issues/3034