我正在发生一个非常简单的http调用。出现错误时,我希望请求重试3次,重试之间延迟三秒钟。我已经解决了一个接近的解决方案:
return this.http.put<string>(URL,
value).retryWhen(err => {
return err
.delay(3000)
.take(3)
.concat(Observable.throw("error occurred"));
})
.catch(err => this.handleHttpError(err)) ;
客户重试了三遍,就像我期望的那样。但是,我不知道如何以我的错误处理程序(通常需要HttpResponse参数)可以处理错误的方式引发最终错误。
一旦采取了(3),如何获得最终错误,并将其转换为HttpResponse以发送给处理程序?还是我看错了方向?
最后,我需要知道伴随错误的HttpResponse。当我在concat函数上从retryWhen抛出err时似乎无法完成它。
我敢打赌这是一件很平常的事,但是对Angular 5来说是新手并使用react,我想我只是想念这艘船。
最佳答案
您可以使用concatMap
来计算尝试重新订阅的次数,并根据该次数发送next
或error
通知(这意味着将错误重新抛出内部的可观察对象,并进一步传播)。
Observable.throw(42)
.retryWhen(err => err
.do(console.info) // remove, prints 42
.delay(3000)
.concatMap((error, index) => {
if (index === 2) {
return Observable.throw("error occurred"); // or Observable.throw(error);
}
return Observable.of(null);
})
)
// .catch(err => handleHttpError(err))
.subscribe(
v => console.log('next', v), // not called
e => console.log('error handler', e),
);
这将输出以下输出:
42
42
42
error handler: error occurred
观看现场演示:https://stackblitz.com/edit/rxjs5-jt5ald
关于error-handling - Angular httpClient retryWhen block 处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50336867/