私はRxJSの達人ではありませんが、私はこれに答えてみたいと思います。
RxJSでエラーをスローすると、オブザーバブルが終了します。結果として、再開することはできませんが、オブザーバブルの再試行/再試行のみを試みることができます。
エラーを再生したくないだけのオリジナル10個の要素を取る必要がある場合は、あなたでしreturn null
代わりのthrow new Error
とちょうどfilter(x => x)
ますtake(10)
前。
それ以外の場合は、retryWhen
を使用してエラー時にobservableを繰り返すことができます。これは2つの項目を取り、失敗し、0、1、...で繰り返すことから始まることに注意してください。2が失敗した後に消えますが、それでも10の項目しか必要としません。
Rx.Observable.interval(1000)
.map((i) => {
if (i === 2) throw(new Error('omg'))
return i
})
.retryWhen((errors) => errors.scan(
(errorCount, err) => {
if(errorCount >= 2) {
throw err;
}
return errorCount + 1;
}, 0)
)
.take(10)
.catch((err) => {
return Rx.Observable.of('ok, we caught an error, but we don\'t want to exit')
})
.subscribe((x) => console.log('result', x))
また、単にいつでも観察可能な仕上げを繰り返し続けるためにrepeat
を使用することができます。これはあなたが望むものではない可能性が高いですが、私はオプションとしてあなたにそれを見せたいと思っていました。あなたが取った場所に注意を払う必要があります。また、放出されたキャッチを観測することもできます。
Rx.Observable.interval(1000)
.map((i) => {
if (i === 2) throw(new Error('omg'))
return i
})
.catch((err) => {
return Rx.Observable.of('ok, we caught an error, but we don\'t want to exit')
})
.repeat()
.take(10)
.subscribe((x) => console.log('result', x))