首页 > web前端 > js教程 > 正文

javascript如何实现宏任务_有哪些例子

夢幻星辰
发布: 2025-12-21 21:31:02
原创
507人浏览过
宏任务是事件循环中每次迭代执行一个的任务,优先级低于微任务,常见类型包括setTimeout、setInterval、setImmediate(Node.js)、I/O回调、UI渲染、postMessage、MessageChannel及script初始执行;其执行顺序为:执行一个宏任务→清空所有微任务→渲染(浏览器)→进入下一宏任务。

javascript如何实现宏任务_有哪些例子

JavaScript 中的宏任务(Macrotask)是事件循环中的一类任务,它们在每次事件循环的迭代中执行一个,且优先级低于微任务(Microtask)。宏任务的主要特点是:每个宏任务执行完后,会清空当前所有微任务队列,再进入下一个宏任务。

常见的宏任务有哪些

以下是最典型的宏任务来源,它们都会被推入宏任务队列(macrotask queue),等待主线程空闲时依次执行:

  • setTimeoutsetInterval回调函数
  • setImmediate(仅 Node.js 环境支持)
  • I/O 操作完成后的回调(如文件读取、网络请求的 callback,Node.js 中)
  • UI 渲染任务浏览器环境,虽不可直接调用,但属于宏任务范畴)
  • postMessageMessageChannel 的消息处理回调
  • script 标签的初始执行(整个脚本本身就是一个宏任务)

宏任务和微任务的执行顺序

理解宏任务的关键在于它和微任务的协作关系。一次事件循环包含:

  • 执行一个宏任务(如 setTimeout 回调)
  • 立即执行所有已排队的微任务(如 Promise.then、queueMicrotask)
  • 渲染(浏览器环境,若需要)
  • 进入下一个宏任务

例如:

立即学习Java免费学习笔记(深入)”;

console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
// 输出顺序:1 → 4 → 3 → 2
登录后复制

这里 setTimeout 是宏任务,排在下一轮;而 Promise.then 是微任务,插在当前宏任务末尾、下个宏任务前执行。

音疯
音疯

音疯是昆仑万维推出的一个AI音乐创作平台,每日可以免费生成6首歌曲。

音疯 178
查看详情 音疯

如何手动触发一个宏任务

没有直接 API 叫 “createMacrotask”,但你可以用标准方式“间接创建”:

  • 使用 setTimeout(fn, 0)setTimeout(fn, 1)(最常用)
  • 使用 setImmediate(fn)(Node.js)
  • MessageChannel 发送空消息(轻量、无延迟,但仍是宏任务):
const channel = new MessageChannel();
channel.port2.onmessage = () => console.log('宏任务执行了');
channel.port1.postMessage(0);
登录后复制

注意:虽然 MessageChannel 延迟极低,但它仍属于宏任务,且会在当前微任务之后、下一个宏任务阶段执行。

为什么 setTimeout(0) 不是立刻执行

因为 JavaScript 的事件循环机制规定:即使延迟设为 0,setTimeout 回调也必须等到当前宏任务 + 所有微任务执行完毕后,才进入下一轮宏任务队列。它只是“尽快安排”,不是“立即插入当前执行”。

这也解释了为什么它比 Promise.then 慢——后者属于微任务,抢占更靠前的时机。

基本上就这些。宏任务是理解 JS 异步行为的基石,掌握它能帮你理清异步代码的真实执行节奏。

以上就是javascript如何实现宏任务_有哪些例子的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号