当前位置: 首页 > news >正文

宏任务与微任务输出顺序练习题

文章目录

      • 一.宏任务与微任务输出顺序练习题
        • 第一题
        • 第二题
        • 第三题
        • 第四题
        • 第五题

一.宏任务与微任务输出顺序练习题

第一题
asyncfunctionfn(){console.log('fn start');awaitPromise.resolve();console.log('fn end');}console.log('script start');fn();setTimeout(()=>{console.log('setTimeout');},0);console.log('script end');

我的回答:script start,fn start,fn end,script end,setTimeout
参考答案:script start → fn start →script end → fn end→ setTimeout
注:async函数在调用时,先执行里面的同步部分,直到遇到await,会把后续代码放入微任务队列(fn end),因此后续的同步代码(‘script end’)会先执行

第二题
console.log('a');setImmediate(()=>{console.log('setImmediate1');});setTimeout(()=>{console.log('setTimeout1');},0);Promise.resolve().then(()=>{console.log('then1');setImmediate(()=>{console.log('setImmediate2');});});console.log('b');

我的回答:a b setImmediate1 then1 setImmediate2 setTimeout1
参考答案:a → b →then1 → setTimeout1 → setImmediate1 → setImmediate2
注:1.微任务(then1)>所有宏任务(setImmediate和setTimeout)
2.宏任务队列中,setTimeout(0ms)优先级高于 setImmediate

第三题
asyncfunctionasync1(){awaitasync2();console.log('async1 end');}asyncfunctionasync2(){console.log('async2');returnPromise.resolve('async2 resolve');}console.log('script start');async1();setTimeout(()=>{console.log('setTimeout');},0);Promise.resolve().then(()=>{console.log('promise then');});console.log('script end');

我的回答:script start,async2,async1 end,script end,promise then,async2 resolve,setTimeout
参考答案:script start → async2 →script end → async1 end → promise then→ setTimeout
注:’async2 resolve’不会输出,没有then
输出过程:

同步代码:script start → async2 → script end 其中,’async2’的输出过程是这样的:调用async1()=>进入async1函数=>执行awaitasync2()=>同步调用async2函数=>进入async2函数=>输出’async2’微任务:async1end=>promise then宏任务:setTimeout
第四题
console.log('1');setTimeout(()=>{console.log('2');},100);setTimeout(()=>{console.log('3');},0);Promise.resolve().then(()=>{console.log('4');});console.log('5');

输出顺序:1 5 4 2 3
参考答案:1 → 5 → 4 → 3 → 2
注:setTimeout(0ms)比 setTimeout(100ms)先执行

第五题
process.nextTick(()=>{console.log('nextTick1');});console.log('start');setTimeout(()=>{console.log('setTimeout');process.nextTick(()=>{console.log('nextTick2');});},0);Promise.resolve().then(()=>{console.log('promise');});process.nextTick(()=>{console.log('nextTick3');});console.log('end');

输出顺序:start,end,nextTick1,nextTick3,promise,setTimeout,nextTick2
注:process.nextTick(微任务)优先级高于Promise.then,宏任务内部的process.nextTick在当前宏任务执行后立即执行

http://www.jsqmd.com/news/523047/

相关文章:

  • Python数据分析新手必看:pandas一行代码计算平均值偏差的3种姿势
  • 2026杭州高端腕表鉴定真假指南|六城正规门店科普,含全品牌辨伪+维修攻略 - 时光修表匠
  • 2026年武汉旧房改造/武汉新房装修/武汉酒店装修/武汉整装装修品牌选购指南:武汉鑫同源建筑装饰工程有限公司 - 2026年企业推荐榜
  • 高难度电子半导体行业厂房环保工程如何落地?优质厂房环保工程公司具备哪些核心资质 - 品牌2026
  • 文墨共鸣大模型C语言入门教学:代码解释与调试助手
  • 从零搭建私有知识库问答系统:Spring AI + Milvus + 智谱GLM-5实战教程
  • OBS项目架构分析:理解大型C++多媒体应用的设计模式
  • 网络分析仪怎么挑?靠谱售后+高性价比厂家一网打尽! - 品牌推荐大师
  • 盒马鲜生礼品卡回收套路深,教你一眼识破 - 京顺回收
  • 2026电子水处理器怎么选?十大品牌防垢除垢技术白皮书发布! - 匠言榜单
  • Neorg性能优化终极指南:10个技巧让组织效率翻倍
  • 【异常】OpenClaw API调用401 The API key doesn‘t exist 报错详解与全流程解决方案
  • 2026Q1 黄冈靠谱装修推荐|华力装饰深耕本土,全包半包整装全案覆盖以实力与口碑定义品质家装 - 品牌智鉴榜
  • Next.js中间件漏洞深度解析:CVE-2025-29927的成因与防御策略
  • rate-limiter-flexible限流器组合:构建多层次的防护体系终极指南
  • 突破9大兼容性限制:WarcraftHelper如何让魔兽争霸3重获新生
  • 【多微电网】计及碳排放的基于交替方向乘子法(ADMM)的多微网电能交互分布式运行策略研究附Matlab代码
  • 避开封号风险!微信自动化开发的3个合规实践(附消息频率控制代码)
  • oneTBB内存池终极指南:10个技巧彻底解决内存碎片并提升性能
  • 吃瓜,硅谷500亿独角兽翻车!Cursor “自研”神模型被扒:底层竟是中国 Kimi 套壳,马斯克亲自实锤
  • 汽车CAN、LIN汇总
  • Youtu-VL-4B-Instruct轻量多模态模型优势:比Qwen-VL-2参数少60%,VQA精度高2.1%
  • TC397硬件平台上,AUTOSAR CAN协议栈配置的‘道’与‘术’:从DBC解析到中断处理的实战思考
  • GitHub仓库的创建与git的连接使用
  • YOLOv8轻量化实战:ShuffleNetV2骨干网络部署与性能调优
  • 深入解析DirectX Shader Compiler架构:基于LLVM的现代编译器设计
  • HoRain云--Coding Plan
  • 【Altium】解决DXF导入尺寸差异:单位设置与比例调整实战指南
  • 从崩溃到稳定:Deno v2.2.11版本发布异常深度复盘
  • Aria2 完美配置终极指南:如何实现 BT 下载速度翻倍