为什么以下代码总是在超时前打印超时?

时间:2019-08-13 04:22:13

标签: javascript node.js

为什么总是出现以下内容:

0

...

999

在超时之内

在即时行内

setImmediate是否在回调队列中优先?

setImmediate(()=>{
    console.log('Inside the immediate');
});

setTimeout(()=> {
    console.log('Inside the timeout');
}, 1);

for (let i = 0; i < 1000; i++) {
    console.log(i);
}

1 个答案:

答案 0 :(得分:1)

GitHub上存在一些引用此行为的问题。 A comment中的these issues在解释其发生原因方面做得很好:

  

您提到的代码会发生什么,就是计时器和   立即添加,然后libuv事件循环开始。什么时候   启动后,libuv事件循环会首先检查计时器,以及是否有时间   在添加计时器和事件循环开始之间的时间是   大于计时器的超时值,则该计时器将触发   在任何立即发生之前。

因此,基本上,如果您尚未进入事件循环,则setTimeout中的回调将在第一个刻度执行。否则,setImmediate将首先执行。

作为演示,如果将setTimeoutsetImmediate包装在另一个setTimeout中,则首先执行setImmediate

setTimeout(function() {
    setTimeout(function() {
        console.log('setTimeout executed!')
    }, 0);
    setImmediate(function() {
        console.log('setImmediate executed!')
    });
}, 20);