我已经使用 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
不能保证执行顺序?