根据条件重试失败的http-req,并指定应该重试的尝试次数-Angular



我有一个post请求,正在我的angular应用程序中使用。我的目标是检查错误中的消息,并根据该消息重试请求,但我想重试一定数量的尝试。

一开始我尝试了这种方法:

public post(url, data) {
this._http.post(url, data).pipe(
retry(3),
catchError((err: HttpErrorResponse) => {
if (err.message === 'something') {
return EMPTY;
}
}),
)
} 

但在这种情况下,它正在尝试发送失败的req,而不检查catchError内部的条件
所以我想使用retryWhen((运算符,但这里我不知道如何指定应该执行的尝试次数

使用RetryWhen

这并不是真正惯用的RxJS,但我认为先理解它,然后再进行更好的流操作会更容易一些。

retryWhen为您提供了一系列错误,这些错误将作为值发出。你可以随心所欲地使用它,包括忽略它。在这种情况下,我使用defer来创建一些本地状态(计数器(,然后订阅这些错误,以便统计特定的错误。

new Observable(observer => {
observer.next(1);
observer.error({message: "something"});
return {unsubscribe: () => {/* Do Nothing*/}};
}).pipe(
retryWhen(errors => defer(() => {
let count = 0; // Some state, created just once
return errors.pipe(
switchMap(err => {
// You effectively have 3 options here. return:
//  1: of(any) -> retry the source Observable
//  2: throwError(any) -> source Observable throws this error
//  3: EMPTY -> source Observable completes
if (err.message === "something" && count < 3){
count++;
return of(null);
}
return throwError(err);
})
)
}))
).subscribe({
next: v => console.log("Next: ", v),
error: e => console.log("Error: ", e),
complete: () => console.log("Complete")
});

这应该与以下输出一起运行(注释是我的;(:

Next: 1  // Emission before error
Next: 1  // Emission from first retry
Next: 1  // Emission from second retry
Next: 1  // Emission from third retry
Error: {"message":"something"} // Too many errors, not retrying any more

最新更新