Error handling 处理来自httpClient retryWhen块的错误
我有一个非常简单的http调用。出现错误时,我希望请求重试3次,两次重试之间有3秒的延迟。我已经找到了一个非常接近的解决方案:Error handling 处理来自httpClient retryWhen块的错误,error-handling,rxjs,httpclient,angular5,Error Handling,Rxjs,Httpclient,Angular5,我有一个非常简单的http调用。出现错误时,我希望请求重试3次,两次重试之间有3秒的延迟。我已经找到了一个非常接近的解决方案: return this.http.put<string>(URL, value).retryWhen(err => { return err .delay(3000) .take(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计算你尝试重新订阅的次数,并根据该次数发送下一个或错误通知,这意味着在进一步传播的内部观察中重新抛出错误
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
请参阅现场演示:对于遇到此问题的任何人,我都可以通过稍微更改返回值来捕获httpErrorResponse:
return error
.do(err => {if (err instanceof HttpErrorResponse) {httpError = err; }})
.delay(3000)
.take(5)
.concat(Observable.throw(error));
})
首先,我添加了一个本地变量
let httpError: HttpErrorResponse = null;
然后我修改了报税表:
return error
.do(err => {if (err instanceof HttpErrorResponse) {httpError = err; }})
.delay(3000)
.take(5)
.concat(Observable.throw(error));
})
这允许我缓存最后一个http错误响应。然后我在捕获中寻找这个,并相应地工作。似乎工作正常。您不是已经在使用.catcherr=>this.handlehttperror执行此操作了吗?或者这个方法会返回什么?嗯,好吧。我捕捉到了错误,但我不知道如何从提供给retryWhen的err observative抛出HttpResponse。。抛出的是一个可观察到的错误,我相信。订阅是在Angular应用程序的不同部分处理的,并且它运行正常。我遇到的问题是在重试后获取伴随错误的httpResponse对象。我似乎无法从httpClient发送到retryWhen的err observable中找到这样做的方法。这有更好的意义吗?所以你想从retryWhen发送错误作为下一个或错误通知?我有同样的问题,你还在使用这个方法吗?我试过了,但得到了一个错误。do函数表示不可用