Неверное значение в наблюдаемой функции подписки - PullRequest
0 голосов
/ 05 июля 2018

Я написал собственную шину событий, используя BehaviorSubject. Он просто выполняет подписку, переданную подписчиком, когда издатель публикует событие. Логика шины событий, кажется, работает правильно, но мои локальные переменные не обновляются корректно, когда подписка выполняется. Ниже приведен код:

Это простая логика, которая проверяет, имеет ли свойство menu объекта карты значение false, затем выполняет некоторую работу и устанавливает ее в значение true, чтобы одна и та же логика не выполнялась дважды при повторном вызове подписки.

Issue: По какой-то причине, когда подписка вызывается во второй раз, свойство меню все еще имеет значение 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 миллисекундах. Когда для свойства объекта установлено значение true в 678 миллисекунд, почему оно показывает false в 679 миллисекунд?

Редактировать: Если бы это был другой многопоточный язык, такой как Java, я бы предположил, что порядок выполнения НЕ гарантирован. Выполнение в более позднее время (679) может все еще получать более старое значение this.map ["menu"], потому что потоки не могут быть синхронизированы. Но поскольку это однопоточный Javascript, гарантируется, что выполнение кода на 679 выполняется после изменения переменной на 678. Ничто не меняет этот факт, как значение результата и т. Д.

Редактировать: Может ли BehaviourSubject быть виновником здесь? Может ли быть так, что внутреннее функционирование BehaviourSubject не гарантирует порядок исполнения?

1 Ответ

0 голосов
/ 05 июля 2018

Вы регистрируетесь перед изменением значения ... поэтому оно показывает 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())        
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...