js事件循环 eventloop

本文深入解析JavaScript的事件循环机制,包括微任务与宏任务的区别,以及执行流程。通过实例讲解,帮助理解异步代码的执行顺序,掌握async/await、Promise等特性在事件循环中的作用。
1.什么是事件循环?

JavaScript有一个基于事件循环的并发模型,事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。这个模型与其它语言中的模型截然不同,比如 C 和 Java。这是来自MDN的介绍。
简单来讲就是js运行处理代码的一套机制。

2.微任务Microtasks和宏任务tasks

宏任务:一般是指js引擎宿主环境发生通信产生的回调任务,常见的宏任务有run <script>(同步的代码执行)、setTimeoutsetIntervalsetImmediate(node环境中)、I/OUI交互

微任务:一般是宏任务在线程中执行产生的回调,常见的微任务有PromiseMutationObserverprocess.nextTick(node环境)。

3.执行流程

执行流程
简单来讲就是在宏任务中,先执行一遍,遇见微任务,将微任务推到队列,再执行所有微任务。拿简单的代码举例

<script>
(function() {
	console.log('start');
	setTimeout(function() {
	  console.log('setTimeout1');
	});
	Promise.resolve().then(function() {
	  console.log('promise1');
	})
	setTimeout(function() {
	  console.log('setTimeout2');
	}, 0);
	console.log('end');
})();
</script>

首先执行第一个宏任务run script,执行里边的匿名函数。首先打印start,遇见setTimeout推入到宏任务队列,再遇见Promise推到微任务队列,再遇见setTimeout推到宏任务队列,打印end。目前的队列如图:

宏任务微任务
setTimeoutPromise
setTimeout

当前的微任务还没执行完毕所以执行Promise,打印promise1;然后再执行下一个宏任务setTimeout打印出setTimeout1,因为这个宏任务中没有微任务,所以接着执行下一个宏任务setTimeout,打印出setTimeout2

再来一个头条的异步笔试题,你要是能答对这个,相信事件循环机制就已经掌握了。

<script>
	async function async1() {
	    console.log('async1 start');
	    await async2();
	    console.log('async1 end');
	}
	async function async2() {
	    console.log('async2');
	}
	console.log('script start');
	setTimeout(function() {
	    console.log('setTimeout');
	}, 0)
	async1();
	new Promise(function(resolve) {
	    console.log('promise1');
	    resolve();
	}).then(function() {
	    console.log('promise2');
	});
	console.log('script end');
</script>

不懂得地方可以去翻看执行流程或者留言,这道题的答案是:script start、async1 start、async2、promise1、script end、async1 end、promise2、setTimeout。

事件循环(Event Loop)是编程中用于管理和调度任务执行顺序的重要机制,在不同的编程环境中都有应用,以下是不同场景下事件循环的相关介绍: ### JavaScript 中的事件循环 JavaScript 是一门单线程的编程语言,在执行任务时采用了事件循环机制,这是其核心概念之一,负责管理和调度任务的执行顺序,以确保代码按照预期的方式运行[^1]。 在浏览器环境中,代码会交给 V8 引擎处理,代码里若调用 nodeApi,node 会交给 LIBUV 库处理。LIBUV 通过阻塞 i/o 和多线程实现了异步 io,再通过事件驱动的方式,将结果放到事件队列中,最终交给应用[^4]。 JavaScript 中的任务分为宏任务和微任务。宏任务包括整体代码 script、setTimeout、setInterval、async 函数;微任务包括 Promise.then(非 new Promise)、process.nextTick(node 中)、await 的下一行内容。事件循环的执行顺序是先执行全局同步代码,从上往下执行,接着执行微任务,最后执行宏任务[^5]。 ### Python 中的事件循环 在 Python 中,协程是通过 asyncio 包中的高级 API 来启动的,而 asyncio 模块的核心就是事件循环(Event Loop)。它可用于执行异步任务、事件回调、执行网络 IO 操作和运行子进程。官方文档建议开发者尽量使用 asyncio 包提供的高级 API,避免直接使用 Event Loop 对象中的方法[^3]。 ### Node 端的事件循环 在 Node 端,代码调用 nodeApi 后会由 LIBUV 库处理,通过事件驱动将结果放到事件队列中。不过对于 Node 端事件循环的理解,部分开发者还不够透彻,在具体代码应用方面也存在不足[^2][^4]。 ```python # Python 中使用 asyncio 进行异步编程示例 import asyncio async def hello(): print("Hello") await asyncio.sleep(1) print("World") async def main(): await asyncio.gather(hello(), hello()) asyncio.run(main()) ``` ```javascript // JavaScript事件循环示例 console.log('Global start'); setTimeout(() => { console.log('setTimeout'); }, 0); Promise.resolve().then(() => { console.log('Promise then'); }); console.log('Global end'); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值