JavaScript – 是骨干的触发器()同步还是异步?

前端之家收集整理的这篇文章主要介绍了JavaScript – 是骨干的触发器()同步还是异步?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在构建一个通用的Backbone视图来管理多个子视图.我有时需要执行逻辑来准备这些视图,然后再呈现.我正在考虑使用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,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);
    }
};

正如其他人所说,触发器处理程序如果有这样的倾向,可以自由安排自己的回调.因此,处理程序在返回之前是否已经完成其工作取决于处理程序代码本身.

猜你在找的JavaScript相关文章