0

0

javascript中事件循环是什么_它如何管理异步任务?

夢幻星辰

夢幻星辰

发布时间:2026-01-12 20:31:03

|

557人浏览过

|

来源于php中文网

原创

事件循环由宿主环境实现,JavaScript引擎只负责同步执行与调用栈;其核心是“轮询—清空微任务队列—执行宏任务”的严格顺序,宏任务包括setTimeout等,微任务包括Promise.then等,且Node.js与浏览器实现存在阶段差异。

javascript中事件循环是什么_它如何管理异步任务?

事件循环不是 JavaScript 引擎自己写的代码

它是由宿主环境(比如浏览器或 Node.js)实现的运行时机制,JavaScript 引擎本身只负责执行同步代码和维护调用。你写的 setTimeoutPromise.thenfetch 这些异步操作,最终都依赖宿主环境把回调“塞进”事件循环的对应队列里。

关键点在于:事件循环不“主动调度”,它只是不断轮询——检查调用栈是否为空,如果空了,就从任务队列里取一个最老的任务执行。

宏任务和微任务队列必须分清

宏任务(macrotask)包括:setTimeoutsetIntervalI/OUI 渲染;微任务(microtask)包括:Promise.then/catch/finallyMutationObserverqueueMicrotask

执行顺序严格是:一次宏任务 → 清空全部当前微任务队列 → 下一次宏任务。这意味着哪怕你在 setTimeout 回调里又 Promise.resolve().then(...),那个 then 也会在下一轮宏任务之前执行。

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

歌者PPT
歌者PPT

歌者PPT,AI 写 PPT 永久免费

下载
console.log(1);
setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
console.log(4);
// 输出:1 → 4 → 3 → 2

async/await 只是 Promise 的语法糖,不改变队列本质

await 后面的表达式一旦返回的是 Promise,函数就会暂停,并把后续代码包装成微任务推入微任务队列。它不会让出线程,也不会变成宏任务。

  • await 不等于 “等一会儿”,而是“等这个 Promise settle 后,把剩下逻辑作为微任务排队”
  • 连续多个 await 不会插入宏任务间隙,除非你显式用了 setTimeout 或类似 API
  • await Promise.resolve()await Promise.reject() 都立即进入微任务队列,区别只在错误是否被 catch

Node.js 和浏览器的事件循环阶段有差异

浏览器事件循环相对简化,而 Node.js 的 libuv 实现了更细粒度的阶段划分:timers → pending callbacks → idle/prepare → poll → check → close callbacks。其中 setImmediate 属于 check 阶段,setTimeout(fn, 0) 属于 timers 阶段,二者执行顺序并不总是一致。

常见陷阱:

  • 在 Node.js 中,setTimeout(fn, 0)setImmediate(fn) 谁先执行,取决于进入事件循环 poll 阶段时是否有 I/O 回调待处理
  • process.nextTick() 比所有微任务还优先,它会在当前操作结束后、任何微任务前执行,但滥用会导致 I/O 饥饿
  • 浏览器没有 setImmediatenextTick,别直接照搬 Node.js 代码
真正容易被忽略的是:**事件循环没有“并发”能力,也没有“多线程”概念。所有回调都在单个主线程上串行执行,所谓“异步”只是延迟交付执行时机,而非并行计算**。理解这点,才能避免对 Promise.allWeb Worker 的误用。

相关文章

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

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

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

377

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

32

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

30

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

103

2026.02.06

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

377

2025.12.24

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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