2017-08-03 3 views
5

短く: .catchをすべて前に入れないでストリームでエラーが発生した後にリスニングを続ける方法.subscribeRxjsがエラーで登録を解除するのはなぜですか?

あなたはより多くの詳細が必要な場合、彼らはここにある:

は、私は、現在のユーザーまたはnullの件名を持っていると仮定します。 APIからデータを取得してSubjectに送信します。それに応じてビューが更新されます。 しかし、私のサーバーではいつかエラーが発生し、私のアプリケーションは以前と同じように動作し続けますが、エラーについてのいくつかの場所に通知し、自分のSubjectを聞いてください。

は当初、私は、私はちょうどuserSubject.error(...)を行うことが唯一のサブスクライブに.catchコールバックとerrorハンドラをトリガし、すべての成功ハンドラとチェーンをスキップするかどうかと思いました。 userSubject.next(...)と呼んだら、私のチェーンと加入者はすべて前と同じように動作します。

しかし、不都合なことではありません。初めにキャッチされていない.errorの後、ストリームから加入者を退会し、それ以上は動作しません。

だから私の質問:なぜ? nullの値を通常どおり扱いたい場合はどうしたらいいですか?ここで

は、エラー時に加入者登録解除errorまたはcomplete通知が配信された後、彼らは何を生み出すことはできないことを意味し https://github.com/ReactiveX/rxjs/blob/master/src/Subscriber.ts#L140

答えて

5

Rx観測follow the grammarnext*(error|complete)?、RxJsのソースコードへのリンクです。

この問題はRx design guidelinesから見つけることができる理由の説明:

観察可能なシーケンスが終了したことを示す単一のメッセージが観測シーケンスの消費者は決定論クリーンアップ操作を実行しても安全であることを立証できるようになります。

複数の観測可能なシーケンスで動作する演算子のアボートセマンティクスを確実に維持できます。

要するに

サーバーエラーが発生した後、あなたのオブザーバーは対象を聴いておきたい場合は、被験者にそのエラーを届けるのではなく、他のいくつかの方法でそれを処理しない(例えばcatchを使用し、retryエラーを専用の科目に送付することができます)。

+0

ありがとう! – mgrinko

3

すべてObservableは0または1以上のnext通知を送信し、1つはerrorまたはcompleteですが、どちらも送信しません。

このため、科目には内部状態があります。

これはチェーンの構築方法によって異なります。たとえば、retry()を使用して、エラーが発生したときにObservableソースに再登録することができます。

それとも、あなたの件名に値を渡すときにのみnext通知を送信し、他の二つを無視することができます。

.subscribe(v => subject.next(v)); 

それとも、ユーザーはあなたがキャプチャする任意の演算子を使用することができますnullときにエラーをスローする場合をエラー通知として送信します。たとえば、次のようになります。

.map(v => { 
    if (v === null) { 
     throw new Error("It's broken"); 
    } 
    return v; 
}) 

とにかくコードなしで正確なアドバイスをするのは難しいです。

+0

'retry()'とは何かを学んでいただきありがとうございます。 – mgrinko

関連する問題