BehaviorSubject を使用してカスタム イベント バスを作成しました。パブリッシャーがイベントを発行するときに、サブスクライバーによって渡されたサブスクリプションを実行するだけです。イベント バス ロジックは正しく動作しているように見えますが、サブスクリプションの実行時にローカル変数が正しく更新されません。コードは次のとおりです。
これは、マップ オブジェクトのメニュー プロパティが false かどうかを確認する単純なロジックであり、サブスクリプションが再度呼び出されたときに同じロジックが 2 回実行されないように、いくつかの作業を行って true に設定します。
問題: 何らかの理由で、サブスクリプションが 2 回目に呼び出されたときに、メニュー プロパティがまだ false のままです。私はjsの非同期動作を理解していますが、今回はうまくいきません。
出力は次のとおりです。
console.log("1 : " + this.map["menu"]);
console.log("time in milliseconds" + +new Date());
this.eventBus.getEventBusSubscription<Boolean>(this.eventBus.KEY, false)
.subscribe(result => {
console.log("2 : " + this.map["menu"]);
console.log("time in milliseconds" + +new Date())
if (!this.map["menu"]) {
this.map["menu"] = true
console.log("3 : " + this.map["menu"]);
console.log("time in milliseconds" + +new Date());
}
console.log("=======END=========")
});
[Log] 1 : false
[Log] time in milliseconds374
[Log] 2 : false
[Log] time in milliseconds678
[Log] 3 : true
[Log] time in milliseconds678
[Log] =======END=========
[Log] 2 : false
[Log] time in milliseconds679
[Log] 3 : true
[Log] time in milliseconds679
[Log] =======END=========
問題は 679 ミリ秒にあります。object プロパティが 678 ミリ秒で true に設定されているのに、679 ミリ秒で false と表示されるのはなぜですか?
編集: Java のような他のマルチスレッド言語だった場合、実行順序が保証されていないと想定していたでしょう。後で (679) 実行すると、スレッドが同期されない可能性があるため、this.map["menu"] の古い値が取得される可能性があります。しかし、これはシングル スレッド Javascript であるため、678 で変数を変更した後に 679 でコードが実行されることが保証されています。結果の値などのように、その事実を変更するものは何もありません。
編集:BehaviourSubject
ここで犯人になることができますか?何らかの方法で、の内部機能BehaviourSubject
が実行順序を保証していない可能性はありますか?