0

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が実行順序を保証していない可能性はありますか?

4

1 に答える 1

0

値を変更する前にログを記録しています...そのため、falseが表示されます。

 if (!this.map["menu"]) {
    console.log("3 : " + this.map["menu")
    console.log("time in milliseconds" + new Date().getMilliseconds())

    this.map["menu"] = true
  }

する必要があります

 if (!this.map["menu"]) {
    this.map["menu"] = true
    console.log("3 : " + this.map["menu")
    console.log("time in milliseconds" + new Date().getMilliseconds())        
  }
于 2018-07-05T07:37:28.477 に答える