2017-05-18 13 views
1

は、次のシナリオを検討RxJs:無限ループを防止

observerX => observableA <= observerY => observableB <= observerZ 
  • 2つの観測B)と3人のオブザーバー(XYがあります、、Z)。
  • これらのオブザーバとオブザーバブルのそれぞれは、別々の(角度の)サービス内にあります。
  • オブザーバーYは、彼らが完了しない観察可能とアプリケーションの期間にわたって「生きている」のまま観察可能B、すなわち両方を観察します。観測イベントをトリガ
  • は、オブザーバーYがイベントをトリガするために観測Bを引き起こす観測Bのサービスに関数を呼び出します。同様に、観測Bは、順番にイベントをトリガする観測を引き起こす観測のサービスに関数を呼び出すイベント、オブザーバYをトリガします。

例:あなたが見ることができるように、すべてのオブザーバーYがやろうとしているオブザーバーY ...

svcA.obsA.subscribe(()=> { 
    svcB.doSomething() 
}); 

svcB.obsB.subscribe(()=> { 
    svcA.doSomething() 
}); 

は同期サービスとサービスBを維持することです。

問題: 上記の設定は、無限の実行ループを引き起こします。この問題を回避するために私の頭に浮かんだ1つのアイデアは、各サブスクリプションにフラグを設定することです。そのフラグが設定されると、他のサブスクリプションは次のイベントを無視します。次のイベントは、必ずしもオブザーバーY doSomething()を呼び出すに対応するものではないかもしれないが、オブザーバーX又はZdoSomething()を呼び出すことによるものであり得るので、それは、しかし、適切な解決策ではありません。

このユースケースには洗練されたソリューションがありますか?私はここで建築上の問題がありますか?問題の説明が明確でない場合は教えてください。

JSFiddles:

+1

問題をより具体的に指定できますか?私。 Observable AとBのデータはどうしていますか?私たちはどのような種類のデータを取っていますか、あなたは2つのObservablesを同期させることを強要していますか?あなたはjorkJoinを使うことができますか? – Siegmeyer

+0

@Siegmeyerご返信ありがとうございます。私は仕事に戻ってから数日後に、あなたに詳細を尋ねる必要があります。 –

+0

@Siegmeyer JSFiddleのサンプルを追加しました。問題の明確化に役立ちます。オブザーバブルはデータを返さず、オブザーバにタスクが完了したことを通知するだけです。サービスAとサービスBとの間のこのセットアップの理由は、それらをモジュール化してお互いに完全に切り離すためです。 ObserverY(アプリケーションロジック)の責任は、サービスの1つがそのタスクを実行するために突き刺されたときに、他のサービスがその役割を果たしていることを確認することです。私はこれが役立つことを願っています –

答えて

0

大丈夫(のみObserverYクラスは、この例では変更されている)ので、この関係のみを転送次オートマトン(ObserverYを使用してモデル化することができます。だから無視することができます):

enter image description here

これは永遠にループします。 問題は、1つのチャンネルのみを使用して無限ループを回避することができないことです(つまり、メッセージが外部か隣接者(A/B)かどうかを確認せずに)。

だから、あなたのオプション:

  1. カップルは一緒にオブジェクトので、彼らは(メッセージがB/Aからのものである場合、A/Bを伝えることができます)メッセージを区別することができます。

  2. 情報を渡すために別々のチャネルを使用します(これはRxでは不可能ですが、間違っている可能性があります)。

  3. 使用このハック:https://jsfiddle.net/6oz6mgLL/、別の方法sync()とブールsyncedを追加します。オブジェクトは結合されていませんが、外部イベントごとに1つの重複したメソッド呼び出し(理由を調べるための調査コード)がかかります。

  4. これはあなたの問題の説明には従いませんが、変更された場合にのみ1つのアイテムとブロードキャストしか持たないReplaySubjectを使用すると、3のソリューションは余分な呼び出しなしでスムーズに動作します。私はあなたがReplaySubjectを適用することができるかどうかわからない。

オブジェクトが概念レベルで結合されている場合、コード内で分離された状態を維持することは、必ずしも可能ではない可能性があります。

これは、少なくとも少し助けてくれました。

関連する問題