2017-02-28 4 views
2

RxJSのオブザーバブルシーケンスを再試行し、3回の試行後にコレクションが成功しなかった場合は、シーケンスのアイテムのエラーオブジェクトをスローする必要があります。RXJSからどのようにエラーをスローしますかObservable retryWhen

var source = get('url').retryWhen(
attempts => 
attempts 
    .zip(Observable.range(1, 3), (_, i) => i) 
    .flatMap(i => { 
    console.log('delay retry by ' + i + ' second(s)'); 
    return Rx.Observable.timer(i * 1000); 
    }); 
); 

var subscription = source.subscribe(
data => { 
// Displays the data from the URL or cached data 
console.log(data); 
}); 

はどのようにして、コレクション内の項目に属するエラーをスローします:私は、この例(An incremental back-off strategy for handling errors)を見つけ?上記のコードは、呼び出し元に対処するのとは対照的に、エラーを飲み込むようです。

答えて

4

あなたのストリームでは、基本的には、エラーを剥ぎ取りともっぱら自分のzipにこのセレクタ機能を使用してみなさ:(_, i) => iから_はエラーになります。

ストリームを調整してセレクタ機能を削除しましたが、これは実際には必要ありません。今度は3回再試行し、再度エラーが発生した場合はエラーをスローします。

const source = Rx.Observable.create(o => { 
 
    o.error(new Error("always fails")); 
 
    }) 
 
    .retryWhen(attempts => attempts 
 
    .zip(Rx.Observable.range(1, 4)) 
 
    .flatMap(([error, i]) => { 
 
     if (i > 3) { 
 
     return Rx.Observable.throw(error); 
 
     } 
 
     console.log('delay retry by ' + i + ' second(s)'); 
 
     return Rx.Observable.timer(i * 100); 
 
    }) 
 
); 
 

 
source.subscribe(
 
    data => console.log(data), 
 
    error => console.error(error) 
 
);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

+0

どうもありがとうございました! –

関連する問題