【问题标题】:Do Javascript event handlers block?Javascript 事件处理程序会阻塞吗?
【发布时间】:2012-04-11 13:54:04
【问题描述】:

(具体来说,我使用的是主干模型事件)

有人可以帮我理解 javascript 事件的工作原理吗?以下内容没有按我预期的方式工作,这让我感到困惑:

在主干中,我对模型进行了更改,然后立即运行了一些代码:

var myVar;
myModel.set('someAttr', true);  // Change my model
myVar = executeSomeFunc();  // Now run some code

然后在我的代码库的其他地方监听事件并处理它(在我的例子中,我用一个集合包装这个模型):

myCollection.on('change:someAttr', changeHandler);  // Listen for the event

我发现myVar = executeSomeFunc() 直到change:someAttr 事件上的所有事件处理程序都完成触发后才会执行。 (我已经通过在事件上附加一个耗时的事件处理程序来检查)

这是预期的行为吗?

【问题讨论】:

    标签: javascript events synchronization backbone.js


    【解决方案1】:

    javascript 中的所有内容都会阻塞,这取决于何时。如果您将处理程序设置为其他功能,则为处理程序触发事件并运行其他功能,它将按照我列举的确切顺序执行。事件处理程序的重点是在触发某些东西时执行代码,但它永远不会是异步的。所以你的答案是,是的,这是预期的行为。要了解 JavaScript 的天堂和地狱,只需搜索 Crockford 关于 JavaScript 的演讲。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      是的。 JavaScript 不是多线程的。当您触发事件时,所有事件处理程序都会立即执行。

      【讨论】:

      • 我的理解是事件处理程序与“触发器”同步运行,但是您在事件处理程序函数中获得正常语义 - 即 - 它可能会在函数调用时让给另一个等待事件处理程序边界 - 例如,事件处理程序内部的函数调用。这不正确吗?
      • 哇...不知道为什么,但这完全是通过我的曲线...我一直认为这些东西都是非阻塞的!感谢 js 101 的课程
      • jQuery 至少指定了处理程序按照绑定的顺序执行。这对我来说意味着没有屈服。据我了解,基本的 javascript 也以这种方式工作 - 绑定事件本质上只是一个依次执行的方法队列。真的没有屈服的概念。
      • 我错了! (产生的唯一方法是 setTimeout)。至于事件处理程序的同步性,这非常彻底地解释了它(答案似乎是“它取决于”):javascript.info/tutorial/events-and-timing-depth
      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多