有谁能解释一下为什么在setTimeout和setImmediate之间添加和删除setImmediate的输出类型如下。
为什么我在执行示例1时得到不同的输出,为什么我得到相同的输出(例如2 )。
示例1:
setTimeout(function(){
console.log("inside timeout")
});
setImmediate(function(){
console.log("inside immediate")
});输出:
inside immediate
inside timeout示例2:
console.log(1)
setTimeout(function(){
console.log("inside timeout")
});
console.log(2)
setImmediate(function(){
console.log("inside immediate")
});
console.log(3)输出:
1
2
3
inside timeout
inside immediate发布于 2019-07-31 08:21:26
让我们谈谈nodeJs的情况。实际上,以下代码的顺序是无法保证的。
setTimeout(function(){
console.log("inside timeout")
});
setImmediate(function(){
console.log("inside immediate")
});如果你运行了很多次,你会发现,很有可能是
inside immediate
inside timeout, 但有时情况正好相反。你第二次演示是一样的。
在nodeJs中,有一个叫做event loop的东西,对于异步函数,event loop将它转发给libuv,然后转发给操作系统。就像。当setTimeout中的时间到来时,回调函数被设置为一个队列,它将在同步线程完成后被调用。对于不同的异步任务,有四个不同的队列,setTimeout's队列在setImmediate's queue.But之前运行--setTimeout的削减返回依赖于CPU的时间片,甚至setTimeout(0),因此它不稳定。
发布于 2019-07-31 07:15:37
编辑
在编辑之后,我将在评论中添加 Meyer给出的答案:
文档是明确的:执行两个定时器的顺序是不确定的,因为它受流程性能的约束。
原始答案
setTimeout和setImmediate是依赖于异步堆栈的异步方法。
即使您使用的是没有计时器的setTimeout (与setImmediate相同),您仍然会将回调放在异步堆栈上。
当释放主JS线程时,将执行此堆栈。
所以在你的例子中,这就是正在发生的事情:
如果在第一次超时时有一个计时器,那么在实际运行堆栈之前需要一段时间,并且最终会在inside immediate输出后面结束。
https://stackoverflow.com/questions/57285104
复制相似问题