Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取setTimeout&;的不同结果;setImmediate内部设置超时_Javascript_Settimeout - Fatal编程技术网

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);