javascript - SetTimeout 和 SetImmediate 与 console.log
问题描述
谁能解释为什么我在两种类型的输出下得到这个,用于在 setTimeout 和 setImmediate 之间添加和删除 console.log。
为什么我在执行示例 1 时得到不同的输出以及为什么我在示例 2 中得到相同的输出。请告诉我 setTimeout 和 setImmediate 之间的区别
示例 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
解决方案
来说说中的情况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
但是setTimeout的cut down return依赖于CPU的时间片,甚至setTimeout(0),所以不稳定。
推荐阅读
- reactjs - React Native JEST TDD - 无法读取未定义的属性“getByText”
- python - PyAudio 错误找不到 PyAudio;检查安装
- php - 使用php错误锁定mysql中的表
- android - 适用于 Xamarin .NET 的 Google Play 计费 API?
- java - Java:使外部包可访问的类中的包级构造函数。仅允许项目内的某些类访问构造函数
- server - Minecraft 服务器托管在没有互联网的 PC 上,只是一个路由器/调制解调器
- sql - 从一组列的最小值中选择行值的最小值
- xml - 如何在 XSLT 中格式化数字以在其间添加一千个分隔符
- c# - AddForce 方法是否可能仅影响我在统一 3D 中调用它的对象?
- java - 如何从打印的列表中删除不需要的项目?