是否会运行或清除作业队列上的setTimeout回调?

时间:2015-10-07 14:05:10

标签: javascript settimeout

如果将setTimeout调用的回调添加到作业队列中(例如,如果它在作业队列中是下一个),则在事件的当前标记上调用clearTimeout循环,提供原始id调用的setTimeout。是否会运行作业队列上的setTimeout回调?

或者运行时是否神奇地从作业队列中删除了回调?

2 个答案:

答案 0 :(得分:4)

不,它不会运行;它将排队,然后中止。当您致电setTimeout时,The specificiation会经历多个步骤,其中一个步骤(在最小超时后加上用户代理填充超时等)最终:

  
      
  1. 将任务任务排队。
  2.   

无论是否已清除步骤10中返回的句柄,这似乎都会发生 - 即对setTimeout的调用将总是导致某些事件被排队。

当你call clearTimeout, it时:

  

必须清除活动计时器列表中标识为句柄的条目

即它不会直接影响已在setTimeout调用中启动的流程。但请注意,在该过程的进一步发展中,任务已定义为:

  
      
  1. 任务成为运行以下子步骤的任务:

         
        
    1. 如果已清除活动计时器列表中句柄的条目,则中止此任务的子步骤
    2.   
  2.   

因此,当任务开始执行时,它将首先检查句柄是否已被清除。

答案 1 :(得分:1)

不,它不会被运行。

我不知道应该使用哪个来源正式支持它,但它至少很容易为自己尝试。

function f() {
    var t1 = setTimeout(function() { console.log("YES"); }, 2000);
    sleep(3000);
    clearTimeout(t1);
    console.log("NO");
}