Javascript 获取setTimeout&;的不同结果;setImmediate内部设置超时
输出Javascript 获取setTimeout&;的不同结果;setImmediate内部设置超时,javascript,settimeout,Javascript,Settimeout,输出 setImmediate(function () { console.log('setImmediate') }); setTimeout(function () { console.log('setTimeout') }, 0); 但是,setTimeout中的这两个函数输出不同的结果 setTimeout setImmediate 输出: setTimeout(function () { setImmediate(function () {
setImmediate(function () {
console.log('setImmediate')
});
setTimeout(function () {
console.log('setTimeout')
}, 0);
但是,setTimeout中的这两个函数输出不同的结果
setTimeout
setImmediate
输出:
setTimeout(function () {
setImmediate(function () {
console.log('setImmediate')
});
setTimeout(function () {
console.log('setTimeout')
}, 0);
}, 0);
正如我们所知,事件循环如下所示-
setImmediate
setTimeout
计时器:从setInterval或setTimeout回调
IO回调:来自I/O事件的回调
空闲:由节点在IO和轮询阶段之间内部使用
轮询:检索新的I/O事件
检查:在此处执行来自setImmediate的回调
闭合:处理闭合连接,如插座
在第一个例子中-
我们可以看到setTimeout在setImmediate之前执行,因为计时器队列位于检查队列之前
但在第二种情况下-
当执行setTimeout时,它会触发另一个setTimeout和一个setImmediate,因为检查队列放在计时器队列之后,同一循环的检查队列执行setImmediate,但嵌套的setTimeout被安排在下一个周期
这就是为什么下面的代码也可以用来定期运行某些东西
timers -> IO -> poll -> check ->close -> timers -> ...
它在第一次调用结束时安排下一次调用,这基本上是为下一个循环注册setTimeout调用。只需忽略:“此功能是非标准的,不在标准轨道上。不要在面向Web的生产站点上使用它:它不会适用于所有用户。实现之间也可能存在很大的不兼容性,将来行为可能会发生变化。”但它们的执行流程必须有一些逻辑,对吗?它们都存在于事件循环的操作顺序中。
let timerId = setTimeout(function tick() {
alert('tick');
timerId = setTimeout(tick, 2000); // (*)
}, 2000);