为什么总是出现以下内容:
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);
}
答案 0 :(得分:1)
GitHub上存在一些引用此行为的问题。 A comment中的these issues在解释其发生原因方面做得很好:
您提到的代码会发生什么,就是计时器和 立即添加,然后libuv事件循环开始。什么时候 启动后,libuv事件循环会首先检查计时器,以及是否有时间 在添加计时器和事件循环开始之间的时间是 大于计时器的超时值,则该计时器将触发 在任何立即发生之前。
因此,基本上,如果您尚未进入事件循环,则setTimeout
中的回调将在第一个刻度执行。否则,setImmediate
将首先执行。
作为演示,如果将setTimeout
和setImmediate
包装在另一个setTimeout
中,则首先执行setImmediate
:
setTimeout(function() {
setTimeout(function() {
console.log('setTimeout executed!')
}, 0);
setImmediate(function() {
console.log('setImmediate executed!')
});
}, 20);