0

何かが足りない気がするので、簡単な質問です。ここでrxjsを使用しているのは、目の前にあるものだからです。これは一般的なreactiveXの質問だと思います。

次のようなオブザーバブルのセットがあるとしましょう。

network_request = some_thing // An observable that produces the result of a network call
event_stream = network_request.flatMapLatest(function(v) {
    return connectToThing(v) // This is another observable that needs v
}) // This uses the result of the network call to form a long-term event-based connection

だから、これはうまくいきます。しかし、問題。時々、接続が失敗します。

だから、私がやればうまくevent_stream.retry()いく。失敗すると、ネットワーク呼び出しをやり直し、v新しい接続を確立するために使用する new を取得します。

問題

から 2 つのものを連鎖させたい場合はどうなりnetwork_requestますか? ネットワーク呼び出しが完了するたびに、UI に何かを表示するなど、UI に何かをさせたいのvでしょうか?

できます:

shared = network_request.share() // Other implementations call this refCount
event_stream = shared.flatMapLatest(...) // same as above
ui_stream = shared.flatMapLatest(...) // Other transformation on network response

私がしなかった場合share、それは 2 つの要求を作成したことになりますが、これは私が望んでいるものではありませんがshareevent_stream後でエラーが発生した場合、refcount がまだ 1 であるため ( のためui_stream) 、ネットワーク要求を再試行しません。 、したがって、すぐに完了を返します。

私が欲しいもの

これは明らかに、私の混乱を説明するために作成した小さな例です。event_stream私が望むのは、 (その長期接続)の結果にエラーが発生するたびに、次のすべてが発生することです。

  1. ネットワーク要求が再度行われる
  2. そのリクエストの新しい応答は、新しい接続を構築するために使用され、event_stream何も起こらなかったように新しいイベントを続行します
  3. 同じ応答が発行されui_stream、さらに処理が行われます

これは複雑なことのようには感じられないので、RX の分割/ファンアウトに関しては、基本的なことを誤解しているに違いありません。

できると思うが避けたい回避策

私はこれらのオブザーバブルをエクスポートしようとしているので、それらをもう一度ビルドしてから「ねえ、これが新しいものです」と言うことができません。私はevent_stream、すべてのダウンストリーム処理が切断されたことを認識しないようにしたいと考えています。についても同じですui_stream。新たな価値を手に入れたのです。

Subjectおそらく、すべてを再起動するたびに ping を実行する世代カウンターとしてを使用して何かを解決し、それnetwork_requestflatMap基づいて を壊すことができるようにすることができshareます...しかし、それは本当にハックなソリューションのように感じます。だから私はそれよりも良い方法がなければならないと感じています。

私は根本的に何を誤解しましたか?

4

2 に答える 2

0

これについてさらに考えていると、ionoy と同じことに気付きました。つまり、retry切断して再接続するだけで、アップストリームはそれがエラーによるものであることを知りません。

欲しいものを考えたとき、チェーンのようなものと観客が本当に欲しいことに気づいたので、今のところこれを手に入れました:

network_request = some_thing
network_shadow = new Rx.Subject()

event_stream = network_request.do(network_shadow).flatMapLatest(...)
ui_stream = network_shadow.whatever

これには、event_streamまたはダウンストリームでの再試行により全体が再起動されるという特性がありますが、ui_streamそれ自体が問題です。network_shadowは実際には のサブスクライバーではないため、そこにあるエラーは何もしませんがevent_stream、メインのイベント チェーンが実行されている限り、値を剥がします。

これは理想的ではないように感じますが、私がしなければならないことを心配していたよりはましrestartEverything.onNext()ですdoOnError

私は今のところこれで作業するつもりです。

于 2016-05-12T14:43:58.493 に答える
0

を使用して、cold オブザーバブルを hot にする必要がありますPublish優れた説明については、 http://www.introtorx.com/Content/v1.0.10621.0/14_HotAndColdObservables.html#HotAndColdを参照してください。

于 2016-05-15T11:51:45.300 に答える