我有一个非常简单的http调用。出错时我希望请求重试3次,重试之间有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函数中。
我认为这是一件很常见的事情,但是对于Angular 5来说更新一些并且我认为我只是错过了这条船。
答案 0 :(得分:1)
您可以使用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
答案 1 :(得分:0)
对于遇到此问题的任何人,我可以通过稍微更改返回来捕获httpErrorResponse:
首先我添加了一个本地var
let httpError: HttpErrorResponse = null;
然后我修改了回报:
return error
.do(err => {if (err instanceof HttpErrorResponse) {httpError = err; }})
.delay(3000)
.take(5)
.concat(Observable.throw(error));
})
这允许我缓存最后的http错误响应。然后我在捕获中查找并相应地工作。似乎工作得很好。