JavaScript 关于事件循环机制的刨析

yizhihongxing

JavaScript 关于事件循环机制的刨析

什么是事件循环机制

JavaScript 引擎采用的是单线程执行模式,只有一个调用堆栈,每一次执行上下文都会从调用堆栈依次出栈,为了解决程序中出现的异步执行问题,JavaScript 引入了事件循环机制。

事件循环机制是指,当 JavaScript 引擎执行完调用堆栈中所有任务后,会去检查任务队列中是否还有任务未执行,如果有则将队列中的任务出队执行,直到队列为空。

事件循环机制的执行顺序

事件循环机制中的任务分为 MacroTask 和 MicroTask 两种,执行顺序如下:

  1. 首先执行所有的 MacroTask 任务,包括 setTimeout 和 setInterval 函数产生的 MacroTask 任务。

  2. 在执行完所有 MacroTask 任务后,依次执行 MicroTask 任务队列中的所有任务,包括 Promise.then() 或 async/await 函数中产生的 MicroTask 任务。

  3. 重复以上两个步骤,直到任务队列为空。

示例说明

示例1

setTimeout(() => {
    console.log('setTimeout 1');
}, 0);

Promise.resolve().then(() => {
    console.log('resolve 1');
}).then(() => {
    console.log('resolve 2');
});

setTimeout(() => {
    console.log('setTimeout 2');
}, 0);

以上代码中,两个 setTimeout 函数产生的 MacroTask 任务会比 Promise.then() 函数产生的 MicroTask 任务先执行。因此,先输出 'setTimeout 1' 和 'setTimeout 2' ,后输出 'resolve 1' 和 'resolve 2'。

示例2

console.log('script start');

async function async1() {
    await async2();
    console.log('async1 end');
}

async function async2() {
    console.log('async2 end');
}

async1();

setTimeout(() => {
    console.log('setTimeout');
}, 0);

new Promise(resolve => {
    console.log('Promise');
    resolve();
}).then(() => {
    console.log('Promise then');
});

console.log('script end');

以上代码中,先执行的是同步代码块,因此先输出 'script start' 和 'script end'。接着执行 async1 函数,由于 async2 函数是异步操作,会被放入 MicroTask 队列中,接着执行 setTimeout 和 Promise 函数,产生了两个 MacroTask 任务和一个 MicroTask 任务,执行顺序如下:

  1. 输出 'async2 end'。

  2. async2 函数执行完毕后,async1 函数接着执行,输出 'async1 end'。

  3. 执行 MicroTask 队列中的 Promise.then() 函数,输出 'Promise then'。

  4. 执行 MacroTask 队列中的 setTimeout 函数,输出 'setTimeout'。

因此输出的结果为:

script start
async2 end
Promise
async1 end
Promise then
setTimeout
script end

以上是 JavaScript 关于事件循环机制的一个初步刨析。深入了解事件循环机制是非常有必要的,能帮助我们更好地理解和应用 JavaScript。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 关于事件循环机制的刨析 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 浅谈Express异步进化史

    浅谈Express异步进化史 什么是异步编程 在讲述Express异步进化史之前,需要先了解什么是异步编程。 异步编程是指程序在执行某个操作时,不会阻塞代码的执行流程,而是在该操作完成后执行一段回调函数。这种编程方式非常适合I/O密集型操作,例如网络请求、文件读写等。异步编程可以提高程序的效率,避免I/O阻塞导致程序假死的情况。 Express的异步进化史 …

    node js 2023年6月8日
    00
  • 通过js随机函数Math.random实现乱序

    通过JS随机函数Math.random()来实现乱序,需要经过以下几个步骤: 确定需要随机排序的数组 首先需要选定需要进行乱序操作的数组。可以是一个由固定元素组成的数组,也可以是动态获取的数据列表等。 例如,下面的代码定义了一个由数字1~5组成的数组: var arr = [1, 2, 3, 4, 5]; 创建一个乱序函数 为了方便对数组进行乱序操作,需要先…

    node js 2023年6月8日
    00
  • Node.js16.15.1的一个报错以及解决方案分享

    那么接下来我将为大家详细讲解“Node.js 16.15.1的一个报错以及解决方案分享”的完整攻略。 问题描述 在使用 Node.js 16.15.1 版本的过程中,可能会遇到以下报错信息: Uncaught TypeError: Cannot read property ‘prototype’ of undefined 报错原因分析 这个报错信息是由于 N…

    node js 2023年6月8日
    00
  • Node.js开发之套接字(socket)编程入门示例

    下面我将详细讲解“Node.js开发之套接字(socket)编程入门示例”的完整攻略。 套接字(socket)编程入门 什么是套接字(socket)编程? 套接字(socket)是一种通信机制,其可用于不同计算机之间的通信,也可用于同一计算机内进程之间的通信。套接字编程则是基于套接字的通信编程。在Node.js中,通过使用net模块提供的套接字API,即可实…

    node js 2023年6月8日
    00
  • NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】

    NodeJS设计模式总结 本文总结了 NodeJS 中常用的设计模式,包括: 单例模式 适配器模式 装饰模式 观察者模式 单例模式 单例模式保证一个类只有一个实例,并提供一个全局的访问入口。 在 NodeJS 中实现单例模式可以通过 module.exports 将类的实例赋值给一个变量,这个变量就成为了全局的访问入口。 示例代码: // Singleton…

    node js 2023年6月8日
    00
  • 快速掌握Node.js中setTimeout和setInterval的使用方法

    以下是“快速掌握Node.js中setTimeout和setInterval的使用方法”的完整攻略: 一、介绍 在 Node.js 中,可以使用 setTimeout 或 setInterval 实现定时器的功能。setTimeout 用来设定一个定时器,在指定的时间间隔后执行一次指定的函数,而 setInterval 则用于重复执行函数。本篇攻略将详细讲解…

    node js 2023年6月8日
    00
  • js中el表达式的使用和非空判断方法

    关于JS中el表达式的使用和非空判断方法,以下是详细攻略: 一、什么是el表达式 el表达式(Expression Language,简称EL) 是java web应用中jsp的一个脚本语言,可以用于页面上动态地展示数据。在JSP页面中,使用 ${ } 扩起来的就是el表达式。 在JS中,我们可以使用el表达式来获取页面上的数据,也可以使用el表达式来向页面…

    node js 2023年6月8日
    00
  • Node多进程的实现方法

    Node多进程是指在Node.js运行环境中使用多个进程来处理任务,可以充分利用CPU资源,提高程序性能和可靠性。以下是Node多进程的实现方法及示例。 一、使用child_process模块创建子进程 child_process模块是Node.js中用于创建子进程的核心模块,可以使用它来创建单个子进程或者多个子进程。具体实现方法如下: 1.1 使用spaw…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部