Обработчики событий кажутся асинхронными относительно других частей кода в javascript (Как обрабатывать временное событие?) - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть некоторый код jQuery, который в идеале должен выполняться следующим образом (псевдокод):

-> parent_element.on("click", function{     <---CLICK_1
  -> add new child element
  -> LOG_1 "new child is ready in DOM"
  -> selector.on("click", function handler{ <---CLICK_2
    -> LOG_2 "a new click"
    -> does stuff
    -> LOG_3 "did some stuff"
    -> if success
      -> selector.off("click", handler)

Но этот код работает очень странно. Когда я нажимаю 1, последовательность журнала выглядит следующим образом:

LOG_2 "a new click"
LOG_3 "did some stuff"
LOG_1 "child is ready in DOM"

Вместо идеальной последовательности ... Это означает, что обработчик второго щелчка был выполнен первым, когда его вообще не нужно запускать.

Теперь, если вы здесь, спасибо, что прочитали это, я предоставлю больше контекста. «Селектор» в DOM фактически включает «parent_element»:

______________________________
|selector                     |
|    ____________________     |
|    |__parent_element__|     |
|_____________________________|

Я предполагаю, что две функции .on распознаются глобально и одновременно?

Так что, хотя я намеревался нажмите на parent_element, обработчик считает, что я пытаюсь нажать на selector, таким образом, сначала выполняется второй обработчик.

Я попытался заменить .on() на .click(). Я попытался обернуть второй обработчик в promise().done() безуспешно. Я также просмотрел документацию .on() и .off() и попытался выключить и включить второй обработчик, но это дает мне странные ошибки.

Есть ли способ гарантировать, что .on() выполняется синхронно с другие части кода? Если нет, то что было бы хорошим способом справиться с такими событиями?

...