JavaScript事件处理的竞争条件?

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

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

>我们在加载移动页面时调用函数foo.
>在foo结束时,如果计数器大于0,我们使用setTimeout再次调用foo(延迟一秒).如果计数器命中0,我们加载一个新页面.超时保存在变量中.
>如果点击了一个按钮,我们调用do_tap函数并清除第二步中保存的超时变量(并执行其他操作).

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

问题:

>假设在执行foo期间发生了敲击.浏览器队列do_tap会在foo完成后开始执行吗?换句话说,我们是否保证一旦foo启动,我们永远不会看到执行foo和do_tap交错?
>如果首先出现水龙头怎么办?保证在foo启动之前完成do_tap,对吗?

解决方法

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

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

您可以阅读有关它的更多信息,并在my other answers之一中查看关于此主题的一系列相关参考资料.

相关文章

kindeditor4.x代码高亮功能默认使用的是prettify插件,prett...
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代...
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小