0

我已经使用 BehaviorSubject 编写了一个自定义事件总线。它只是在发布者发布事件时执行订阅者传递的订阅。事件总线逻辑似乎工作正常,但订阅执行时我的局部变量没有正确更新。以下是代码:

这是一个简单的逻辑,它检查 map 对象的 menu 属性是否为 false,然后它会做一些工作并将其设置为 true,这样当再次调用订阅时,相同的逻辑不会被执行两次。

问题:由于某种原因,第二次调用订阅时,菜单属性仍然为 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 毫秒。当对象属性在第 678 毫秒设置为 true 时,为什么它在第 679 毫秒显示为 false?

编辑:如果它是像 Java 这样的其他多线程语言,我会假设不能保证执行顺序。稍后的执行(679)可能仍然会获得 this.map["menu"] 的旧值,因为线程可能未同步。但这是单线程 Javascript,可以保证在 678 处更改变量后执行 679 处的代码。没有什么能改变这一事实,比如结果的值等。

编辑:可能BehaviourSubject是这里的罪魁祸首吗?是不是通过某种方式内部功能BehaviourSubject不能保证执行顺序?

4

1 回答 1

0

您在更改值之前记录...这就是它显示错误的原因。

 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 回答