我正在构建用于管理多个 subview 的通用Backbone View 。有时我需要执行逻辑来准备这些 View ,然后再渲染它们。我正在考虑使用Backbone事件来启用pre_render Hook ,如下所示:

view = new (this.child_view);
this.trigger('pre_render', view);
view.render();

是否可以同步执行trigger()调用的事件,从而确保它们都将在render()行被调用之前完成?

最佳答案

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

这是源代码中的相关部分:

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;
},

导入函数是triggerEvents,它实际上调用处理程序。根据comments,它只是一个优化的调度程序。注意,它们都在调用.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);
    }
};

但是,正如其他人提到的那样,如果触发处理程序愿意,可以随意安排自己的回调。因此,处理程序是否将在返回之前完成工作取决于处理程序代码本身。

09-07 22:34