Backbone的触发器()是同步还是异步?

Bra*_*och 11 javascript backbone.js

我正在构建一个通用的Backbone视图来管理多个子视图.我有时需要执行逻辑来在渲染之前准备这些视图.我正在考虑使用Backbone事件来启用pre_render钩子,如下所示:

view = new (this.child_view);
this.trigger('pre_render', view);
view.render();
Run Code Online (Sandbox Code Playgroud)

调用的事件是否trigger()会同步执行,从而保证在render()调用线路之前它们都将完成?

voi*_*hos 12

基本上,是的,它是同步的.

以下是来源的相关部分:

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;
},
Run Code Online (Sandbox Code Playgroud)

导入功能triggerEvents实际上是调用处理程序.根据评论,它只是一个优化的调度员.请注意,他们都在呼吁.call().apply(),因此控制交回给调用者之前,回调将完成.

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);
    }
};
Run Code Online (Sandbox Code Playgroud)

但是,正如其他人所提到的,触发处理程序可以自由地安排自己的回调,如果它们如此倾向.因此,处理程序在返回之前是否已完成其工作取决于处理程序代码本身.