我们正在Angular中发出一个http请求,该请求返回一些包含布尔值的数据,该布尔值指示数据是否已被完全处理。我们想从第一个http响应中发出不完整的数据,并继续发出http请求,直到处理成功为止。如果第一个响应返回的结果为true,我们也希望避免重复http请求。我们正在使用retryBackoff库,如果我正确理解的话,它只是retryWhen,在后台运行了一段时间。
以下是我们正在处理的代码的示例:
const crashDetails$ = combineLatest(crashId$, database$)
.pipe(switchMap(([crashId, database]) => {
return this._crashDetailsService.getCrashDetails({crashId, database});
});
const crashDetailsWithRetry$ = crashDetails$
.pipe(
tap(crashDetails => {
if (!crashDetails.processed) {
throw new Error('Still processing, retry if able');
}
}),
retryBackoff(retryOptions)
);
return merge($crashDetails, crashDetailsWithRetry$);
问题是在处理为true的情况下发出了2个请求。
我尝试将share()和shareReplay(1)添加到crashDetails $,但这导致crashDetailsWithRetry $停止工作。有没有一种简单的方法可以实现我们想要的目标,还是应该创建一个新的主题并使用自定义重试逻辑来处理这种情况?
谢谢!
答案 0 :(得分:1)
这只是一个条件轮询方案:
const crashDetails$ = combineLatest(crashId$, database$)
.pipe(switchMap(([crashId, database]) => {
// switch into a timer that switches into your observable, take while processing
return timer(0, 3000).pipe( // set 3000 to whatever ms interval you want to poll on
switchMapTo(this._crashDetailsService.getCrashDetails({crashId, database}),
takeWhile(details => !details.processed, true) //take while not processed
);
});
return crashDetails$;