Я пытаюсь использовать 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));
})
Он делает максимум 3 попытки, если получает ошибку тайм-аута.
Но всегда имейте в виду, что я хочу сделать это более абстрактным для использования в различных случаях использования, и для этого я должен проверить тип ошибки.
Повторно будут предприняты только технические ошибки.
Так что я пробовал это без успеха.
.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
, но безуспешно.
Заранее спасибо!