問題タブ [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.

0 投票する
1 に答える
427 参照

rxjs - Observable をプロキシし、コールバックで接続する

Observableコールバックで非同期に作成された を返そうとしています:

したがって、コールバックSubjectの基になるものにサブスクライブされるユニキャスト プロキシとしてを使用します。Observable

このソリューションで私が抱えている問題は、Subjectの購読を解除すると、購読解除が基になる に転送されないことObservableです。Subjectサブスクライバーがなくなったときにサブスクライブを解除するには、何らかのタイプの参照カウントが必要なようですが、この種の命令型コールバック スタイルで使用する場合、それを理解できませんでした。

私はボイドを維持する必要がありmkAsync、代替の実装を探しています。

それは正しい方法ですか?を使用する代わりの解決策はありSubjectますか?

サブジェクトがサブスクライブ解除されたときに、作成されたObservableがキャンセルされる (unsubscribeで呼び出される)ことを確認するにはどうすればよいですか?Subscription

0 投票する
1 に答える
111 参照

javascript - 監視可能なサブスクライブ関数の値が正しくありません

BehaviorSubject を使用してカスタム イベント バスを作成しました。パブリッシャーがイベントを発行するときに、サブスクライバーによって渡されたサブスクリプションを実行するだけです。イベント バス ロジックは正しく動作しているように見えますが、サブスクリプションの実行時にローカル変数が正しく更新されません。コードは次のとおりです。

これは、マップ オブジェクトのメニュー プロパティが false かどうかを確認する単純なロジックであり、サブスクリプションが再度呼び出されたときに同じロジックが 2 回実行されないように、いくつかの作業を行って true に設定します。

問題: 何らかの理由で、サブスクリプションが 2 回目に呼び出されたときに、メニュー プロパティがまだ false のままです。私はjsの非同期動作を理解していますが、今回はうまくいきません。

出力は次のとおりです。

問題は 679 ミリ秒にあります。object プロパティが 678 ミリ秒で true に設定されているのに、679 ミリ秒で false と表示されるのはなぜですか?

編集: Java のような他のマルチスレッド言語だった場合、実行順序が保証されていないと想定していたでしょう。後で (679) 実行すると、スレッドが同期されない可能性があるため、this.map["menu"] の古い値が取得される可能性があります。しかし、これはシングル スレッド Javascript であるため、678 で変数を変更した後に 679 でコードが実行されることが保証されています。結果の値などのように、その事実を変更するものは何もありません。

編集:BehaviourSubjectここで犯人になることができますか?何らかの方法で、の内部機能BehaviourSubjectが実行順序を保証していない可能性はありますか?