我正在尝试实现重试的angular5 http。我写了
http.get<any>('/api/study').retryWhen(
(errors: Observable<any>):Observable<any> => {
return errors.flatMap((error: any) => {
if (error.status == 500) {
return Observable.of(error.status).delay(1000);
}
return Observable.throw(error);
}).take(5);
});
如果出现错误500,这将继续重试5次。但是,如果连续发生5个失败,则返回成功(带有空数据(。我不要那个。相反,我希望它丢弃最后一个错误。
我尝试将.concat(Observable.throw({}))
放置在take((之后,但它没有给我任何信息,例如最新错误的状态代码。
上次重试失败后,如何获得最新错误?
您不需要使用take(5)
来计算失败的尝试,并使用局部变量自己计数。
例如,您可以这样做:
http.get<any>('/api/study').retryWhen((errors: Observable<any>) => {
let errors = 0;
return errors.flatMap((error: any) => {
if (errors++ < 5 && error.status == 500) {
return Observable.of(error.status).delay(1000);
}
return Observable.throw(error);
});
});
.retryWhen
只能完整或错误 - 在这两种情况下,进一步的检索将被中止。参见文档。
因此,当您添加.take(5)
时,您基本上是在告诉它重试5次,然后完成,此时它只能完成(因此也不能返回错误 - 其他,不是两者(。
因此,使用.take()
无法解决您的问题。
不幸的是,这意味着您必须跟踪重试时的重试计数 - 因此,对于5个计数,您只需让它返回错误(这将触发重试(,最后在第6次上手动丢弃错误。然后,您可以在捕获块中捕获最终错误。
类似的东西(代码未测试,但显示了这个想法(:
http.get<any>('/api/study').retryWhen(err => {
console.log('retrying');
let retries = 0;
return err
.delay(1000)
.map(error => {
if (retries++ === 6) {
console.log('retry number ', retries);
throw error; <- THIS WILL CAUSE retryWhen to complete
}
return error;
});
})
.catch(err => {
console.log('caught');
return Observable.of(err);
})
.subscribe(data => {
console.log('subscriber');
console.log(data);
});
作为附带说明,添加.concat(observable.throw({}((无法解决您的问题,因为当开火时,您的5次恢复完成了,因此重新恢复时(即返回,返回,返回,所以没有错误(。这就是为什么Concat无法丢弃最后一个错误,因为它从未收到过。