setImmediate(function () {
console.log('setImmediate')
});
setTimeout(function () {
console.log('setTimeout')
}, 0);输出
setTimeout
setImmediate但是,setTimeout内部的这两个函数输出的结果不同。
setTimeout(function () {
setImmediate(function () {
console.log('setImmediate')
});
setTimeout(function () {
console.log('setTimeout')
}, 0);
}, 0);输出:
setImmediate
setTimeout发布于 2020-06-21 17:40:06
我们知道事件循环是这样的-
timers -> IO -> poll -> check ->close -> timers -> ...定时器:来自setInterval或setTimeout的回调IO回调: I/O事件回调Idle:在IO和Poll阶段Poll之间的节点内部使用
在第一个例子中-
我们可以看到setTimeout在setImmediate之前被执行,因为计时器队列放在检查队列之前。
不过,在第二宗个案中-
当setTimeout被执行时,它会触发另一个setTimeout和一个setImmediate,因为检查队列位于timer队列之后,相同循环的检查队列执行setImmediate,但是嵌套setTimeout被调度到下一个周期。
这就是下面的代码也可以用于定期运行的原因。
let timerId = setTimeout(function tick() {
alert('tick');
timerId = setTimeout(tick, 2000); // (*)
}, 2000);它计划下一个调用,就在第一个调用的末尾,它基本上为下一个循环注册了setTimeout的调用。
https://stackoverflow.com/questions/62501823
复制相似问题