RxJS 5 with Angular 2: 重试失败 Observable 但随后转发错误
RxJS 5 with Angular 2: Retry failed Observable but then forward error
当 HTTP 请求失败时,我想每隔 1 秒重试两次。如果它第三次再次失败,我想将该错误转发给观察者。我在最后一部分遇到了问题。
来自 DataService.get()
的 HTTP 请求
return this.http.get(url,options)
.retryWhen(errors => errors.delay(1000).take(2))
.catch((res)=>this.handleError(res));
订阅
this.dataSvc.get('/path').subscribe(
res => console.log(res),
err => console.error(err),
() => console.log('Complete')
);
我的服务器设置为总是 return 错误(状态 400 Bad request
)。
我希望应用程序发出第 2 个请求,发出第 3 个请求,然后抛出要被 this.handleError()
捕获的错误
实际发生了什么:应用程序发出第二个请求,发出第三个请求,然后 Observable 完成且没有错误(“Complete”打印到控制台)
Angular 2 rc.6
、RxJS 5 beta 11
、Typescript 2.0.2
return this.http.get(url,options)
.retryWhen(errors => errors.delay(1000).scan((acc,source,index)=>{
if(index) throw source;
}))
.catch((res)=>this.handleError(res));
scan()
的参数:
acc
:一个累加器(想想Array.reduce()
)。如果你修改return它,新值将在下一次执行时作为acc
参数提供
source
:前一个操作发出的值(或异常)(delay()
,它本身从 errors
转发它)
index
:当前发射值的索引(从零开始)
这发出了 3 个 HTTP 请求(不知道为什么;我本以为是 2 个)。在第三次失败时,它抛出 source
——发出的错误——被 handleError()
捕获
当 HTTP 请求失败时,我想每隔 1 秒重试两次。如果它第三次再次失败,我想将该错误转发给观察者。我在最后一部分遇到了问题。
来自 DataService.get()
的 HTTP 请求return this.http.get(url,options)
.retryWhen(errors => errors.delay(1000).take(2))
.catch((res)=>this.handleError(res));
订阅
this.dataSvc.get('/path').subscribe(
res => console.log(res),
err => console.error(err),
() => console.log('Complete')
);
我的服务器设置为总是 return 错误(状态 400 Bad request
)。
我希望应用程序发出第 2 个请求,发出第 3 个请求,然后抛出要被
this.handleError()
捕获的错误
实际发生了什么:应用程序发出第二个请求,发出第三个请求,然后 Observable 完成且没有错误(“Complete”打印到控制台)
Angular 2 rc.6
、RxJS 5 beta 11
、Typescript 2.0.2
return this.http.get(url,options)
.retryWhen(errors => errors.delay(1000).scan((acc,source,index)=>{
if(index) throw source;
}))
.catch((res)=>this.handleError(res));
scan()
的参数:
acc
:一个累加器(想想Array.reduce()
)。如果你修改return它,新值将在下一次执行时作为acc
参数提供source
:前一个操作发出的值(或异常)(delay()
,它本身从errors
转发它)index
:当前发射值的索引(从零开始)
这发出了 3 个 HTTP 请求(不知道为什么;我本以为是 2 个)。在第三次失败时,它抛出 source
——发出的错误——被 handleError()