Zasadniczo tak, jest synchroniczny.
Oto odnośny odcinek od źródła:
trigger: function(name) {
if (!this._events) return this;
var args = slice.call(arguments, 1);
if (!eventsApi(this, 'trigger', name, args)) return this;
var events = this._events[name];
var allEvents = this._events.all;
if (events) triggerEvents(this, events, args);
if (allEvents) triggerEvents(this, allEvents, arguments);
return this;
},
Funkcja importu jest triggerEvents
, które faktycznie wywołuje ładowarki. Według comments, jest to po prostu zoptymalizowany dyspozytor. Zauważ, że wszystkie wywołują .call()
i .apply()
, więc wywołanie zwrotne zostanie zakończone, zanim sterowanie zostanie przekazane z powrotem do osoby dzwoniącej.
var triggerEvents = function(obj, events, args) {
var ev, i = -1, l = events.length;
switch (args.length) {
case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx);
return;
case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0]);
return;
case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1]);
return;
case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1], args[2]);
return;
default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
}
};
Jak już wspomnieli inni, operatory obsługujące wyzwalacze mogą dowolnie planować własne wywołania zwrotne, jeśli są tak skłonne. Zatem to, czy osoby odpowiedzialne za obsługę zakończą swoją pracę przed powrotem, zależy od samego kodu obsługi.
pewno znaleźć uwagami źródło użytecznych; Najczęściej lubię zostawiać papierowy ślad, odpowiadając na takie pytania. Dzięki! –