【发布时间】:2016-12-06 21:57:12
【问题描述】:
我正在尝试在 HTTP 调用中使用 retryWhen。
尝试这样使用时效果很好:
return this.http.get(`${environment.apiUrl}/track/${this.user.instance._id}/${this.currentPlayer.playlist.id}/next?s=${this.playerCounter}`, options)
.timeout(500, new TimeoutError(`Timeout trying to get next track. [instanceId=${this.user.instance._id}]`))
.retryWhen(attempts => {
return Observable.range(1, 3).zip(attempts, i => i).flatMap(i => 3 === i ? Observable.throw(attempts) : Observable.timer(i * 1000));
})
如果出现超时错误,最多尝试 3 次。
但是,总是有一个问题,我想让它更抽象以用于各种用例,为此,我必须检查错误的类型。
只会重试 TechnicalErros。
所以我尝试了这个但没有成功。
.retryWhen(attempts => {
return attempts.flatMap(error => {
if(error instanceof TechnicalError) {
return Observable.range(1, 3).zip(attempts, i => i).flatMap(i => 3 === i ? Observable.throw(attempts) : Observable.timer(i * 1000));
} else {
Observable.throw(error);
}
});
})
它在第一次尝试时停止并且不执行Observable.timer(),也不执行Observable.throw()。
我几乎可以肯定问题出在第一个flatMap上,我已经尝试使用mergeMap,但没有成功。
提前致谢!
【问题讨论】:
标签: angular rxjs observable rxjs5 angular-http