首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setTimeout和setImmediate在setTimeout中的不同结果

setTimeout和setImmediate在setTimeout中的不同结果
EN

Stack Overflow用户
提问于 2020-06-21 17:05:09
回答 1查看 40关注 0票数 0
代码语言:javascript
复制
setImmediate(function () {
    console.log('setImmediate')
});

setTimeout(function () {
    console.log('setTimeout')
}, 0);

输出

代码语言:javascript
复制
setTimeout
setImmediate

但是,setTimeout内部的这两个函数输出的结果不同。

代码语言:javascript
复制
setTimeout(function () {
    setImmediate(function () {
        console.log('setImmediate')
    });

    setTimeout(function () {
        console.log('setTimeout')
    }, 0);
}, 0);

输出:

代码语言:javascript
复制
setImmediate
setTimeout
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-21 17:40:06

我们知道事件循环是这样的-

代码语言:javascript
复制
timers -> IO -> poll -> check ->close -> timers -> ...

定时器:来自setInterval或setTimeout的回调IO回调: I/O事件回调Idle:在IO和Poll阶段Poll之间的节点内部使用

在第一个例子中-

我们可以看到setTimeout在setImmediate之前被执行,因为计时器队列放在检查队列之前。

不过,在第二宗个案中-

当setTimeout被执行时,它会触发另一个setTimeout和一个setImmediate,因为检查队列位于timer队列之后,相同循环的检查队列执行setImmediate,但是嵌套setTimeout被调度到下一个周期

这就是下面的代码也可以用于定期运行的原因。

代码语言:javascript
复制
let timerId = setTimeout(function tick() {
  alert('tick');
  timerId = setTimeout(tick, 2000); // (*)
}, 2000);

它计划下一个调用,就在第一个调用的末尾,它基本上为下一个循环注册了setTimeout的调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62501823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档