我正在构建一个用于管理多个子视图的通用Backbone视图。我有时需要执行逻辑来准备这些视图,然后再呈现它们。我正在考虑使用骨干活动,以使pre_render钩,就像这样:Backbone的触发器()是同步的还是异步的?
view = new (this.child_view);
this.trigger('pre_render', view);
view.render();
将trigger()
称为事件同步进行,从而保证他们将在render()
行之前完成的所有调用?
我正在构建一个用于管理多个子视图的通用Backbone视图。我有时需要执行逻辑来准备这些视图,然后再呈现它们。我正在考虑使用骨干活动,以使pre_render钩,就像这样:Backbone的触发器()是同步的还是异步的?
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);
}
};
正如其他人所说,虽然触发处理程序可以自由地安排自己的回调,如果他们如此倾向。因此,处理程序是否在返回之前完成其工作取决于处理程序代码本身。
是的,它们是同步的。但是,由此事件触发的功能可以免费使用setTimeout
或发出ajax请求,如果是这样,在trigger
调用返回并且代码继续调用render
时,这些功能将不会完成。所以是的,每个绑定的事件处理程序将被调用,但不一定完成其整个处理集。因为触发器API本身不使用回调或承诺,所以没有直接了解所有事件处理程序何时完成的方法。如果有必要,你将不得不自己实现这样一个API,并在包括任何异步处理在内的任何事情完成时触发一个独特的事件。然而,在日常编程中,大多数这些事件处理程序是同步的,如果不是这样的话,代码通常是这样构造的,即程序不会导致应用程序不正常。如果你需要改变这个合约,这是一种代码异味,你的应用程序设计不能和谐地使用事件系统,你可能想要考虑针对你的问题的不同方法。
根据源代码触发器是同步的,并不意味着所有侦听“pre_render”事件的函数都会通过 执行同步操作。 PS:源代码是很容易阅读,你真的应该看看它:
我肯定找注明出处有用的;在回答这样的问题时,我最喜欢留下纸条。谢谢! –