我正在尝试retryWhen在HTTP调用中使用.
尝试使用时,它完美地工作:
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));
})
Run Code Online (Sandbox Code Playgroud)
如果出现超时错误,最多会尝试3次.
但是,总是有一个buuut,我想让它更抽象地用于各种用例,为此,我必须检查错误的类型.
只会重试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);
}
});
})
Run Code Online (Sandbox Code Playgroud)
它首先尝试停止,不执行Observable.timer(),也不执行Observable.throw().
我几乎可以肯定问题是关于第一个 …