【发布时间】:2023-03-17 09:05:04
【问题描述】:
我有以下模仿 HTTP 请求轮询的代码。
timeout:Observable<number> = timer(10000);
startPollingStackblitz(arnId: string) {
const poll:Observable<BuyingData[]> = of({}).pipe(
mergeMap(_ => {
console.log('polling...' + arnId);
return of([]);
// return this.service.getData(arnId);
}),
takeUntil(this.timeout),
tap(_ => console.info('---waiting 2 secs to restart polling')),
delay(2000),
repeat(),
tap(_ => console.info('---restarted polling')),
);
this.subscription = poll.subscribe((data) => {
console.log('subscribe...')
if (data.length > 0) {
console.log('timeout...');
console.log(this.timeout);// I want to stop polling immediately before timer will elapse
}
});
}
我希望当服务器以 data.length > 0 响应时,我的轮询停止发送 HTTP 请求(在此演示版本中它记录“轮询...”)。出于某种原因,即使在 10000 毫秒超时后它也会继续发送请求。我该怎么做?
【问题讨论】:
-
也许使用
retry而不是repeat? -
恐怕不行。请参阅此处的示例 2 learnrxjs.io/learn-rxjs/recipes/http-polling
-
timer(10000)将在 10 秒后发出 0,这是一个虚假值。所以takeUntil不会停止管道。您可以使用timer(10000,1)的重载使其真实,或者使用timeout运算符将其与您可以在订阅中触发的主题合并。 -
@Eldar 无关紧要
takeUntil下的流是否发出虚假值,它发出 就足够了。即使是Subject<void>也可以。 -
@Eldar 感谢您的回答,但
timer(10000,1)没有帮助。你能用timeout运算符为你的另一个理论写一个代码sn-p 吗?
标签: angular rxjs observable polling rxjs-observables