2017-03-07 12 views
2

私は観察可能なシーケンスをどのように消費するか、そしてエラーから回復する方法を理解しようとしています。rxjsのエラーから回復するには?

私の例は少し工夫されていますが、実際の実装はここではあまりにも複雑すぎます。とにかく、ユーザーがUIをクリックしたときに値を返すsomeObservableがあります。これにより、API(GET/POST/etc)へのリクエストがトリガーされます。問題は、APIがエラーを返す場合、それ以降はpostDataは呼び出されないということです。

ここでは、問題を示す例を示します。私は、実行するためにRx.Observable.throwの代わりにRx.Observable.ofを使用できることを発見しました。しかし、それはsubscribe関数に値を出します。そして、私の実際のアプリケーションでは、postDataは、アプリケーションの複数の部分で再利用されるサービスであり、throwの代わりにofを使用したいと確信できません。

私の質問は、どのようにこれらのようなものを普通に扱うのですか?

let someObservable = Rx.Observable.timer(1, 1000); 

someObservable 
.switchMap(data => { 
    return postData(data); 
}) 
.catch(error => { 
    console.log("POST failed"); 
}) 
.subscribe(val => console.log("Success: " + val)); 

function postData(data) { 
    console.log("Will post " + data); 

    if (data !== 2) { 
    return Rx.Observable.of(true); 
    } 
    else { 
    return Rx.Observable.throw(new Error("400 Bad Request or something")); 
    } 
} 

http://jsbin.com/naroyeyive/3/edit?js,console

+1

即座にキャッチ: 'return postData(data).catch(...)'変更されたビン:http://jsbin.com/rujakoguro/3/edit?js,console –

+0

@arturgrzesiakさて、これはうまくいくようです!答えを書いて簡単に説明できると思いますか?私はコードに似ているのではなく、そこにキャッチする必要がありますか? – Joel

答えて

2

あなたが要求を再送信したい場合は、代わりにcatchretryretryWhenに見てみたいことがあります。

catchは、新しい "ソース"としてObservableを返します。 See this bin for an example.

retry(When)は、オペレータに渡す設定に基づいて、エラーが発生するたびに「再購読」します。ここでは例と詳細を見つけることができます:https://www.learnrxjs.io/operators/error_handling/retrywhen.html

+0

キャッチは、その後に値を返すobservableを返す場合、ストリームを終了しません。それは間違いなくリカバリーポイントです –

+1

はい、そうです。私はJoelが '.catch()'を使っていた方法を指していました。私の答えを明確にするために更新する。 –

関連する問題