JavaScript事件处理的竞争条件?

Cra*_*lot 6 javascript jquery html5 javascript-events

我们知道JavaScript是单线程的,但我们想确认我们对JavaScript中异步事件处理的理解.更重要的是,我们想确认我们没有遇到潜在的竞争条件.

从概念上讲,我们的移动应用是这样的:

  1. 我们foo在加载移动页面时调用函数.

  2. 最后foo,如果计数器大于,我们setTimeoutfoo再次调用(延迟一秒)0.如果计数器命中0,我们加载一个新页面.超时保存在变量中.

  3. 如果点击了一个按钮,我们调用函数do_tap并清除第二步中保存的超时变量(并执行其他操作).

do_tap并且foo都更新相同的页面元素,我们想确认它们不会互相踩踏.

问题:

  1. 假设在执行期间发生敲击foo.浏览器队列do_tap会在foo完成后开始执行吗?换句话说,我们保证一旦foo开始,我们永远不会看到执行foodo_tap交错吗?

  2. 如果首先出现水龙头怎么办?do_tap保证在foo开始前完成,对吧?

jfr*_*d00 8

除了Web worker和合作框架或窗口(这里没有使用)之外,Javascript在给定窗口中是单线程的,因此在该窗口中永远不会有两个执行线程同时运行.因此,在使用线程时,您不必担心可能是典型问题的竞争条件.

在幕后,Javascript有一个事件队列.您当前的执行线程将运行完成,然后当它完成时,javascript解释器将检查事件队列以查看是否还有更多事情要做.如果是这样,它会触发该事件并启动另一个执行线程.几乎所有事情都经历了事件队列(计时器,关键事件,调整大小事件,鼠标事件等......).

您可以阅读更多相关信息,并在关于此主题的其他答案中查看大量相关参考资料.


Poi*_*nty 5

事件执行继续单线程,直到事件处理完毕.在此之前,不会启动任何其他事件循环.

换句话说,当一个处理程序正在为某个事件运行时,任何其他事件的其他处理程序都不会中断它.

因此,问题1和问题2的答案都是"是".(当然,这是在禁止浏览器漏洞的情况下,但是如果你考虑到这一点,你就不会走得太远.它不像是有任何同步原语可以依赖.我说这只是因为有一段时间在此期间Safari可以在运行另一个"DOMready"事件处理程序的过程中触发"DOMready"事件.但是,这显然是一个错误.)