問題タブ [subject-observer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rxjs - Observable をプロキシし、コールバックで接続する
Observable
コールバックで非同期に作成された を返そうとしています:
したがって、コールバックSubject
の基になるものにサブスクライブされるユニキャスト プロキシとしてを使用します。Observable
このソリューションで私が抱えている問題は、Subject
の購読を解除すると、購読解除が基になる に転送されないことObservable
です。Subject
サブスクライバーがなくなったときにサブスクライブを解除するには、何らかのタイプの参照カウントが必要なようですが、この種の命令型コールバック スタイルで使用する場合、それを理解できませんでした。
私はボイドを維持する必要がありmkAsync
、代替の実装を探しています。
それは正しい方法ですか?を使用する代わりの解決策はありSubject
ますか?
サブジェクトがサブスクライブ解除されたときに、作成されたObservable
がキャンセルされる (unsubscribe
で呼び出される)ことを確認するにはどうすればよいですか?Subscription
javascript - 監視可能なサブスクライブ関数の値が正しくありません
BehaviorSubject を使用してカスタム イベント バスを作成しました。パブリッシャーがイベントを発行するときに、サブスクライバーによって渡されたサブスクリプションを実行するだけです。イベント バス ロジックは正しく動作しているように見えますが、サブスクリプションの実行時にローカル変数が正しく更新されません。コードは次のとおりです。
これは、マップ オブジェクトのメニュー プロパティが false かどうかを確認する単純なロジックであり、サブスクリプションが再度呼び出されたときに同じロジックが 2 回実行されないように、いくつかの作業を行って true に設定します。
問題: 何らかの理由で、サブスクリプションが 2 回目に呼び出されたときに、メニュー プロパティがまだ false のままです。私はjsの非同期動作を理解していますが、今回はうまくいきません。
出力は次のとおりです。
問題は 679 ミリ秒にあります。object プロパティが 678 ミリ秒で true に設定されているのに、679 ミリ秒で false と表示されるのはなぜですか?
編集: Java のような他のマルチスレッド言語だった場合、実行順序が保証されていないと想定していたでしょう。後で (679) 実行すると、スレッドが同期されない可能性があるため、this.map["menu"] の古い値が取得される可能性があります。しかし、これはシングル スレッド Javascript であるため、678 で変数を変更した後に 679 でコードが実行されることが保証されています。結果の値などのように、その事実を変更するものは何もありません。
編集:BehaviourSubject
ここで犯人になることができますか?何らかの方法で、の内部機能BehaviourSubject
が実行順序を保証していない可能性はありますか?