何かが足りない気がするので、簡単な質問です。ここで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 つの要求を作成したことになりますが、これは私が望んでいるものではありませんがshare
、event_stream
後でエラーが発生した場合、refcount がまだ 1 であるため ( のためui_stream
) 、ネットワーク要求を再試行しません。 、したがって、すぐに完了を返します。
私が欲しいもの
これは明らかに、私の混乱を説明するために作成した小さな例です。event_stream
私が望むのは、 (その長期接続)の結果にエラーが発生するたびに、次のすべてが発生することです。
- ネットワーク要求が再度行われる
- そのリクエストの新しい応答は、新しい接続を構築するために使用され、
event_stream
何も起こらなかったように新しいイベントを続行します - 同じ応答が発行され
ui_stream
、さらに処理が行われます
これは複雑なことのようには感じられないので、RX の分割/ファンアウトに関しては、基本的なことを誤解しているに違いありません。
できると思うが避けたい回避策
私はこれらのオブザーバブルをエクスポートしようとしているので、それらをもう一度ビルドしてから「ねえ、これが新しいものです」と言うことができません。私はevent_stream
、すべてのダウンストリーム処理が切断されたことを認識しないようにしたいと考えています。についても同じですui_stream
。新たな価値を手に入れたのです。
Subject
おそらく、すべてを再起動するたびに ping を実行する世代カウンターとしてを使用して何かを解決し、それnetwork_request
にflatMap
基づいて を壊すことができるようにすることができshare
ます...しかし、それは本当にハックなソリューションのように感じます。だから私はそれよりも良い方法がなければならないと感じています。
私は根本的に何を誤解しましたか?