我正在构建一个通用的Backbone视图来管理多个子视图.我有时需要执行逻辑来准备这些视图,然后再呈现.我正在考虑使用Backbone事件来启用预先挂钩,如下所示:
view = new (this.child_view); this.trigger('pre_render',view); view.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,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[1],args[2]); return; default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx,args); } };
正如其他人所说,触发器处理程序如果有这样的倾向,可以自由安排自己的回调.因此,处理程序在返回之前是否已经完成其工作取决于处理程序代码本身.