新闻中心

J*aScript 微任务队列:理解 Promise 与 setTimeout 的执行顺序

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

javascript 微任务队列:理解 promise 与 settimeout 的执行顺序

在 J*aScript 中,异步编程离不开事件循环(Event Loop)机制,而微任务队列是其中的关键部分。很多人对 PromisesetTimeout 的执行顺序感到困惑,其实只要理解了宏任务与微任务的区别,这个问题就迎刃而解。

宏任务与微任务的基本概念

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

OneStory 是一款创新的AI故事生成助手,用AI快速生成连续性、一致性的角色和故事。

OneStory 319 查看详情 OneStory 主流程结束 微任务:外部 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代码规范 

搜索