Javascript setTimeout和非计时器(如UI)事件回调的顺序是否根据时间进行保证?
假设我们创建一个计时器Javascript setTimeout和非计时器(如UI)事件回调的顺序是否根据时间进行保证?,javascript,events,asynchronous,Javascript,Events,Asynchronous,假设我们创建一个计时器setTimeout(f,1000),然后创建一个带有单击处理程序的按钮。如果在setTimeout之后没有运行同步代码,则“保证”一秒钟内响应单击的单击处理程序将首先被调用 但是,考虑同步处理何时继续: a_button.onclick = function () { console.log("ui") } setTimeout(function () { console.log("timer") }, 1000) s = Date.now() while (Date.n
setTimeout(f,1000)
,然后创建一个带有单击处理程序的按钮。如果在setTimeout之后没有运行同步代码,则“保证”一秒钟内响应单击的单击处理程序将首先被调用
但是,考虑同步处理何时继续:
a_button.onclick = function () { console.log("ui") }
setTimeout(function () { console.log("timer") }, 1000)
s = Date.now()
while (Date.now() - s < 2000) { /* waste two seconds of CPU and block the UI */ }
a_button.onclick=function(){console.log(“ui”)}
setTimeout(函数(){console.log(“timer”)},1000)
s=日期。现在()
while(Date.now()-s<2000){/*浪费两秒钟的CPU并阻塞UI*/}
是否有任何保证在以下情况下首先发生哪一事件
- 。。在一秒钟之前按下按钮
- 。。一秒钟后按下按钮
在反思了yvesmancera评论中的文章之后,我认为回答问题的否定(?)方面就足够了:
- 每个挂起的UI事件是否在过期计时器之前处理?在其他未决事件之前
- 是否在任何过期计时器之前处理(Web Works | XHR |内部DOM)的事件?关于计时器,此行为是否与UI事件处理不同?这些事件相对于挂起的UI事件是如何排序的
- 等待此算法的任何调用在其
等于或小于此算法的调用完成之前启动timeout
这意味着,如果实施符合规范要求,则:
——对于此代码,setTimeout(第一个,0);setTimeout(秒,0)
将始终在第一次
第二次
——对于此代码,第一个setTimeout(秒,20);setTimeout(第一个,10)
也总是在第二个
之前触发
在处理来自不同队列的事件时,状态如下:
- 在事件循环的任务队列之一上运行最早的任务,忽略关联文档未完全激活的任务。用户代理可以选择任何任务队列
- 作为国家
老实说,我并不清楚,因为“用户代理可以选择任何任务队列。”语句。我认为它允许实现以任意顺序运行它们。jQuery的作者John Resig在这篇博文中解释了超时、间隔和异步回调是如何工作的,我强烈推荐@yvemancera感谢链接,这是一篇有趣的文章。特别是,我想我在询问回调之间“队列中”事件的顺序——它是严格意义上的队列还是优先级队列?它是否会因浏览器而异?上面的例子有点做作(可能有缺陷,但在Chrome中有可重复的结果),留下了“当它们发生时”的定义。仅在计时器内,时间顺序是有保证的:
setTimeout(第一,0);setTimeout(秒,0)
和(做一些小假设)setTimeout(秒,20);setTimeout(first,10)
。规范说明它是一个列表:这意味着它们将按照一个接一个地添加的顺序执行。@zerkms对于计时器来说,这非常清楚,这实际上让我想到了这个问题;对于不同类型的事件(可以或不能)如何交织,是否有类似的算法?我不应该在我之前的评论中使用“假设”,因为我谨慎地选择了这些值。@user2864740“交错”是什么意思?