新闻中心
J*aScript 微任务队列:理解 Promise 与 setTimeout 的执行顺序
宏任务与微任务决定执行顺序:同步代码先执行,宏任务如setTimeout后于微任务如Promise.then执行。事件循环每次执行一个宏任务后立即清空微任务队列。例如,Promise初始化和then回调中,同步输出“Promise初始化”,接着“同步代码结束”,之后处理微任务输出“Promise then执行”,最后执行下一个宏任务“setTimeout执行”。即使在setTimeout内创建Promise,其then仍作为微任务在该宏任务结束后立即执行,而非等待下一宏任务。async/await也基于微任务机制,await后的代码被包装成Promise.then,延迟到微任务阶段执行。因此,正确理解宏任务与微任务的优先级和执行时机是掌握J*aScript异步行为的关键。

在 J*aScript 中,异步编程离不开事件循环(Event Loop)机制,而微任务队列是其中的关键部分。很多人对 Promise 和 setTimeout 的执行顺序感到困惑,其实只要理解了宏任务与微任务的区别,这个问题就迎刃而解。
宏任务与微任务的基本概念
J*aScript 的任务分为两类:
- 宏任务(Macrotask):包括整体代码块、setTimeout、setInterval、I/O、UI 渲染等。
- 微任务(Microtask):包括 Promise.then/catch/finally、MutationObserver、queueMicrotask 等。
事件循环每次从宏任务队列中取出一个任务执行,执行完毕后,会清空当前所有的微任务队列,然后再取下一个宏任务。
Promise 是微任务,setTimeout 是宏任务
这是理解执行顺序的核心。来看一个经典例子:
let promise = new Promise(resolve => { console.log('Promise 初始化'); resolve(); }); promise.then(() => { console.log('Promise then 执行'); }); setTimeout(() => { console.log('setTimeout 执行'); }, 0); console.log('同步代码结束');输出结果为:
Promise 初始化 同步代码结束 Promise then 执行 setTimeout 执行说明:
- “Promise 初始化” 是同步执行的。
- “同步代码结束” 紧随其后。
- 此时当前宏任务结束,开始处理微任务队列,执行 .then 回调。
- 微任务清空后,进入下一个宏任务,执行 setTimeout 回调。
微任务在宏任务之间被集中执行
即使在 setTimeout 回调中创建 Promise,它的 .then 也会在该宏任务结束后立即执行:
setTimeout(() => { console.log('宏任务:setTimeout'); Promise.resolve().then(() => { console.log('微任务:setTimeout 内部的 Promise'); }); }, 0); Promise.resolve().then(() => { console.log('微任务:外部 Promise'); }); console.log('主流程结束');输出:
OneStory
OneStory 是一款创新的AI故事生成助手,用AI快速生成连续性、一致性的角色和故事。
319
查看详情
主流程结束
微任务:外部 Promise
宏任务:setTimeout
微任务:setTimeout 内部的 Promise
解释:
- 主流程是一个宏任务,执行完后先处理微任务队列,输出“外部 Promise”。
- 然后进入下一个宏任务(setTimeout),输出“宏任务:setTimeout”。
- 该宏任务执行完后,再检查是否有微任务——发现内部 Promise 的回调,于是执行它。
常见误区与注意事项
有些人认为 setTimeout(fn, 0) 就能立刻执行,但实际上它只是将任务推入下一个宏任务队列,必须等待所有微任务完成。
另一个误区是认为 async/await 不产生微任务。实际上,async 函数中的 await 后续代码会被包装成 Promise.then,也就是微任务。
async function async1() { console.log('async1 开始'); await async2(); console.log('async1 结束'); } async function async2() { console.log('async2'); } async1(); console.log('同步代码');输出:
async1 开始 async2 同步代码 async1 结束因为 await 相当于把“async1 结束”放进微任务队列,等当前宏任务结束后才执行。
基本上就这些。掌握微任务和宏任务的执行节奏,就能准确预测 J*aScript 异步代码的行为。不复杂但容易忽略。
以上就是J*aScript 微任务队列:理解 Promise 与 setTimeout 的执行顺序的详细内容,更多请关注其它相关文章!
# 这是
# 中国建设银行网站登入
# web 前端seo优化
# 鄞州区商铺工装网站建设
# 榆次网站推广效果付费
# 没有seo工作经验
# 微山互联网营销推广公司
# 涟源网站推广服务
# 防城港高效seo技巧
# csgo免费开箱网站推广码
# 商城网站建设优化公司
# 会在
# 结束后
# 微任务
# 是一个
# 自动关闭
# 弹出窗口
# 完后
# 就能
# 清空
# 回调
# 区别
# ai
# mac
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法
外媒分析《GTA6》定价:卖100美元可以但真没必要!
顺丰快递查单号物流信息 顺丰快递小程序查询入口
Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法
qq音乐在线播放入口_qq音乐电脑版登录链接
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
Go语言中对Map值调用带指针接收者方法:原理与最佳实践
微信网页版官方入口直达 微信网页版网页版登录使用方法
J*aScript中安全有效地处理localStorage字符串数据
2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享
将JSON对象数组转置为键值对列表的实用指南
抖音网页版怎么|直播|_抖音网页版开播操作指南
《刺客信条:影》PS5 Pro和Switch 2画面对比
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】
C++如何比较两个字符串_C++ string compare函数与操作符对比
React Router 嵌套组件中 URL 重定向问题的解决方案
手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析
初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解
如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】
怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】
邮政快递单号查询入口 邮政快递物流信息在线查询入口
谷歌推RCS信息存档功能:公司可监控员工私密信息!
css绝对定位元素脱离父容器怎么办_确保父元素position非static
J*aScript异步迭代器_j*ascript异步遍历
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
Python多线程中正确使用sigwait处理SIGALRM信号
微信网页版官方入口教程 微信网页版网页版快速登录步骤
拼多多赚钱渠道_拼多多收益来源
J*aScript 字符串标签转换:使用正则表达式高效替换
探索高级语言到原生C/C++的转译:挑战与内存管理策略
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】
J*aScript DOM操作:高效清空列表元素的策略与实践
cad如何更改注释性对象的比例_cad注释性比例调整方法
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
离线运行Go语言之旅:本地部署与GOPATH配置指南
C++如何生成随机数_C++ random库使用方法与范围设置
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
夸克AO3官网入口_AO3镜像网站2025推荐
怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】
J*a编写用户注册与登录功能_掌握字符串与验证逻辑
基于动态规划的房屋花卉种植最小成本算法详解
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
从J*aScript对象中精确提取指定属性的教程
淘宝支付提示失败如何解决 淘宝支付流程优化方法
J*a递归快速排序中静态变量的状态管理与陷阱
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
J*aScript类型检查_j*ascript代码规范


2025-11-04
浏览次数:次
返回列表
nc/await也基于微任务机制,await后的代码被包装成Promise.then,延迟到微任务阶段执行。因此,正确理解宏任务与微任务的优先级和执行时机是掌握J*aScript异步行为的关键。