私はretryWhen
をHTTPコールで使用しようとしています。角2 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回の試行の最大になります。
しかし、常にbuuutを持っていますので、さまざまなユースケースで使用するためにこれをより抽象的にしたいと思います。このために、エラーのタイプを確認する必要があります。
テクニカルエロスだけが再試行されます。
私はこれをうまくやってみました。
.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
を使用しようとしましたが、成功しませんでした。
ありがとうございます!
"range"演算子を使用してカウンタ変数を取り除くことができれば、それはかなりうまくいくでしょう。 –