js,timeout,promise执行顺序
2024-08-28 13:08:42
总结
macro-task包括:script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering。
micro-task包括:process.nextTick, Promises, Object.observe, MutationObserver
总的来说就是:
不同的任务会放进不同的任务队列之中。
先执行macro-task,等到函数调用栈清空之后再执行所有在队列之中的micro-task。
等到所有micro-task执行完之后再从macro-task中的一个任务队列开始执行,就这样一直循环。
当有多个macro-task(micro-task)队列时,事件循环的顺序是按上文macro-task(micro-task)的分类中书写的顺序执行的。
先执行正常栈中的代码,在执行micro-task,然后是macro-task.
也就是set开头的最后执行,promise在set之前,promise方法里的第一个执行方法不入栈,在正常栈里执行
console.log('golb1');
setImmediate(function() {
console.log('immediate1');
process.nextTick(function() {
console.log('immediate1_nextTick');
})
new Promise(function(resolve) {
console.log('immediate1_promise');
resolve();
}).then(function() {
console.log('immediate1_then')
})
})
setTimeout(function() {
console.log('timeout1');
process.nextTick(function() {
console.log('timeout1_nextTick');
})
new Promise(function(resolve) {
console.log('timeout1_promise');
resolve();
}).then(function() {
console.log('timeout1_then')
})
setTimeout(function() {
console.log('timeout1_timeout1');
process.nextTick(function() {
console.log('timeout1_timeout1_nextTick');
})
setImmediate(function() {
console.log('timeout1_setImmediate1');
})
});
})
new Promise(function(resolve) {
console.log('glob1_promise');
resolve();
}).then(function() {
console.log('glob1_then')
})
process.nextTick(function() {
console.log('glob1_nextTick');
})
上面的代码要在node环境里执行,
结果如下:
golb1
glob1_promise
glob1_nextTick
glob1_then
timeout1
timeout1_promise
timeout1_nextTick
timeout1_then
immediate1
immediate1_promise
immediate1_nextTick
immediate1_then
timeout1_timeout1
timeout1_timeout1_nextTick
timeout1_setImmediate1
最新文章
- Kafka资源汇总
- Hibernate多对一(注解)
- java代码和spring框架读取xml和properties文件
- 更改OneDrive同步文件夹
- bat 批处理 字符串 截取
- Asp.Net MVC--Controller激活2
- Android常用第三方框架
- n数码问题, 全排列哈希
- Jquery中dialog属性小记
- angular 数据加载动画 longding
- 安装JDK+Tomcat,进行环境变量设置,和运行JSP
- 使用CSS设置滚动条样式以及如何去掉滚动条的方法
- 【CERC2016】【BZOJ4792】村庄 搜索
- [心得] SQL Server Partition(表分區) 資料分佈探討
- PHP 框架实现原理
- SpringCloudConfig配置中心git库以及refresh刷新
- html如何引用另一个html的内容
- 【爬坑】python3+pyqt5+pyinstaller 打包成exe的各种问题
- spring cloud 入门系列:总结
- grunt入门讲解6:grunt使用步骤和总结