首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SetTimeout和SetImmediate与console.log

SetTimeout和SetImmediate与console.log
EN

Stack Overflow用户
提问于 2019-07-31 07:08:11
回答 2查看 1.8K关注 0票数 2

有谁能解释一下为什么在setTimeout和setImmediate之间添加和删除setImmediate的输出类型如下。

为什么我在执行示例1时得到不同的输出,为什么我得到相同的输出(例如2 )。

示例1:

代码语言:javascript
复制
setTimeout(function(){
        console.log("inside timeout")
});

setImmediate(function(){
        console.log("inside immediate")
});

输出:

代码语言:javascript
复制
inside immediate
inside timeout

示例2:

代码语言:javascript
复制
console.log(1)

setTimeout(function(){
        console.log("inside timeout")
});
console.log(2)
setImmediate(function(){
        console.log("inside immediate")
});
console.log(3)

输出:

代码语言:javascript
复制
1
2
3
inside timeout
inside immediate
EN

回答 2

Stack Overflow用户

发布于 2019-07-31 08:21:26

让我们谈谈nodeJs的情况。实际上,以下代码的顺序是无法保证的。

代码语言:javascript
复制
 setTimeout(function(){
            console.log("inside timeout")
    });

    setImmediate(function(){
            console.log("inside immediate")
    });

如果你运行了很多次,你会发现,很有可能是

代码语言:javascript
复制
inside immediate
inside timeout, 

但有时情况正好相反。你第二次演示是一样的。

在nodeJs中,有一个叫做event loop的东西,对于异步函数,event loop将它转发给libuv,然后转发给操作系统。就像。当setTimeout中的时间到来时,回调函数被设置为一个队列,它将在同步线程完成后被调用。对于不同的异步任务,有四个不同的队列,setTimeout's队列在setImmediate's queue.But之前运行--setTimeout的削减返回依赖于CPU的时间片,甚至setTimeout(0),因此它不稳定。

票数 2
EN

Stack Overflow用户

发布于 2019-07-31 07:15:37

编辑

在编辑之后,我将在评论中添加 Meyer给出的答案:

文档是明确的:执行两个定时器的顺序是不确定的,因为它受流程性能的约束。

原始答案

setTimeout和setImmediate是依赖于异步堆栈的异步方法。

即使您使用的是没有计时器的setTimeout (与setImmediate相同),您仍然会将回调放在异步堆栈上。

当释放主JS线程时,将执行此堆栈。

所以在你的例子中,这就是正在发生的事情:

  • 执行console.log(1)
  • 将第一个回调放在堆栈上。
  • 执行console.log(2)
  • 将第二个回调放在堆栈上。
  • 执行console.log(3)
  • 释放主线程
  • 执行第一次回调
  • 执行console.log(“内部超时”)
  • 释放主线程
  • 执行第二次回调
  • 执行console.log(“立即内部”)

如果在第一次超时时有一个计时器,那么在实际运行堆栈之前需要一段时间,并且最终会在inside immediate输出后面结束。

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

https://stackoverflow.com/questions/57285104

复制
相关文章

相似问题

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