Is dispatchEvent синхронизация или асинхронная функция

Я пытаюсь написать обработчик событий для пользовательского события в WinJS. Я не слишком уверен, как это работает в IE - Я создаю настраиваемое событие и отправляю его -

var eventObject = document.createEvent("CustomEvent");
eventObject.initCustomEvent("dropbomb", true, true, null);
this._element.dispatchEvent(eventObject);

Мой обработчик -

this._element.addEventListener("logtelemetry", function () {
                console.log("boom");
});

Можно ли быть уверенным, что обработчик будет вызываться синхронно, а не позже? Если да, то что является доказательством.

Ответы

Ответ 1

Гарантируется синхронность, потому что:

Возвращаемое значение dispatchEvent указывает, будет ли какой-либо из слушателей, которые обрабатывали событие с именем preventDefault.

Поскольку возвращаемое значение указывает, был ли какой-либо из слушателей, которые обрабатывали событие с именем preventDefault, метод должен блокировать (не возвращать), пока все слушатели не будут выполнены, что является определением синхронного вызова.

Вышеприведенная цитата представляет собой выдержку из спецификации dispatchEvent в событиях уровня 2 DOM, в результате чего статус "Рекомендация" (стандарт) возвращается в Ноябрь 2000. Internet Explorer выполнил этот стандарт с по крайней мере IE 9.

Чтобы убедиться в этом, добавьте оператор console.log сразу после вашего вызова .dispatchEvent и обратите внимание, что "boom" (из вашего обработчика событий) всегда регистрируется в первую очередь.

Ответ 2

Обработчик будет вызван немедленно, используя стандартную реализацию WinJS.Utilities.eventMixin. Нет отсрочки.

Ваши индивидуальные обработчики могут выбрать отложенную работу с помощью setTimeout/setImmediate/setInterval/requestAnimationFrame или какой-либо другой выполненной по заказу реализации.

Обратите внимание, что если вы говорите о событиях DOM, прося их пузыриться по дереву элементов DOM - что я не на 100% понятен (может быть, кто-то может добавить это конкретное здесь)