Блокируют ли обработчики событий Javascript? - PullRequest
3 голосов
/ 28 марта 2012

(В частности, я использую события Backbone Model)

Может кто-нибудь помочь мне понять, как работают события javascript? Следующее не работает так, как я ожидал, и это сбило меня с толку:

В магистрали я изменяю свою модель, и сразу же после этого запускаю некоторый код:

var myVar;
myModel.set('someAttr', true);  // Change my model
myVar = executeSomeFunc();  // Now run some code

Затем где-то еще в моей кодовой базе я слушаю событие и обрабатываю его (в моем случае я обертываю эту модель коллекцией):

myCollection.on('change:someAttr', changeHandler);  // Listen for the event

Я обнаружил, что myVar = executeSomeFunc() не выполняется до тех пор, пока все обработчики событий для события change:someAttr не завершат работу. (Я проверил, прикрепив к событию трудоемкий обработчик событий)

Это ожидаемое поведение?

Ответы [ 2 ]

5 голосов
/ 28 марта 2012

Да. JavaScript не многопоточный. Когда вы запускаете события, все обработчики событий выполняются немедленно.

1 голос
/ 28 марта 2012

Все в блоках javascript, зависит только когда. Если вы установите обработчик для других функций, запустите событие для обработчика и запустите другие функции, которые будут выполняться в том порядке, в котором я их перечислил. Смысл обработчиков событий заключается в выполнении кода при запуске чего-либо, но он никогда не будет асинхронным. Так что ответ для вас - ДА, это ожидаемое поведение. Чтобы понять рай и ад javascript, просто поищите речи Крокфорда о javascript.

Надеюсь, это поможет.

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