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*/}
是否有任何保证在以下情况下首先发生哪一事件

  • 。。在一秒钟之前按下按钮
  • 。。一秒钟后按下按钮
也就是说,不同类型的事件是根据它们“发生”的时间排序的吗?

如果没有保证,行为会随着浏览器的不同而改变,还是存在操作方式

如果没有UI事件的保证,是否有Web Workers、XHR或image oncomplete事件等的保证

请提供涵盖或反驳此类保证的资源;或者提出有力的反对理由,最好是反例(以一种无需手动或可能错误地点击即可测试的方式)


在反思了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“交错”是什么意思?