Является ли функция триггера jQuery гарантированной синхронной - программирование
Подтвердить что ты не робот

Является ли функция триггера jQuery гарантированной синхронной

Функция триггера кажется синхронной. То есть все связанные функции, как представляется, выполняются последовательно, синхронно (вызываемая функция может делать что-то асинхронно, но это не вопрос).

Это верно для пользовательских и нестандартных (щелчок, зависание и т.д.) событий? Существуют ли какие-либо события, когда однопоточная гарантия javascript не выполняется?

Если это правда, можно ли изменить поведение, чтобы выполнить их асинхронно, не вставляя таймауты в каждую связанную функцию?

Вот пример, который демонстрирует вопрос:

var ele = $('#blah');
// Example of the bound function doing something synchronously
ele.bind('customEvent.sync', function() {
    // Do something synchronously
    window.foo = 'foo';
});

// Example of the bound function doing something asynchronously
ele.bind('customEvent.async', function() {
    window.setTimeout(function() {
        // Do something asynchronously
        window.bar = 'bar';
    }, 0);
});

// Trigger both events
ele.trigger('customEvent');

// If trigger is guaranteed to be synchronous this should alert 'foo:undefined' or possibly 'foo:bar' depending on whether the asych function was called first
// If trigger is NOT synchronous 'undefined:undefined', 'foo:undefined', 'undefined:bar', or 'foo:bar' could be alerted
alert(window.foo + ':' + window.bar);

UPDATE Смотрите: Является ли JavaScript гарантированным однопоточным? Пользовательские события гарантированно синхронны из-за однопоточного характера javascript. Некоторые встроенные типы событий могут быть несинхронными из-за несоответствий браузера.

4b9b3361

Ответ 1

Легко модифицированная антология комментариев, высказанная мной сама - Свекот-Свекот:

  • События не имеют продолжительности; при условии, что обработчик прикреплен, они вызывают начало потока. Поэтому событие само по себе не может быть ни синхронным, ни асинхронным. Поток, который стимулирует событие, всегда будет синхронным, но может инициировать один или несколько асинхронных процессов.

  • Вызов .trigger() всегда синхронен независимо от любых асинхронных процессов, которые могут быть запущены в обработчике инициированных событий. Когда возвращаемый обработчик возвращается, выполнение возвращается в оператор, следующий за .trigger(...). т.е..trigger() - это прославленный вызов функции.

  • В javascript текущий поток абсолютно гарантированно запускается до завершения, прежде чем что-либо будет запущено с запуском setTimeout(), даже если длительность таймаута равна 0. То же самое с ajax - потоком, который вызывает, скажем, $.ajax(...) гарантированно завершается до того, как какой-либо из обработчиков success/error/complete начнется, даже если сервер должен немедленно ответить.

  • Однопоточность присуща ECMA-262 (javascript), т.е. в любой момент времени может работать не более одного потока.

Дополнительная точка:

Полученный ответ на Является ли javascript гарантированно однопоточным? основан на ложной предпосылке. Нет никаких доказательств того, что javascript не является однопоточным. Комментарий от @KrisGiesing развенчивает недоразумение.