RXJS立即发出并重试

时间:2019-07-26 19:31:41

标签: javascript angular typescript rxjs

我们正在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 $停止工作。有没有一种简单的方法可以实现我们想要的目标,还是应该创建一个新的主题并使用自定义重试逻辑来处理这种情况?

谢谢!

1 个答案:

答案 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$;