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

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日

相关文章

  • Babel 入门教程学习笔记

    Babel 入门教程学习笔记 什么是 Babel Babel 是一个广泛使用的 JavaScript 编译器,它能将 ECMAScript 2015+ 代码转换为向后兼容的 JavaScript 代码。这意味着,我们可以使用最新的 JavaScript 语言特性开发项目,同时也可以保证代码在现有的浏览器和环境中执行正确。 安装 Babel 安装 Babel …

    node js 2023年6月8日
    00
  • 从零揭秘npm install的黑科技

    当我们执行 npm install 命令时,实际上发生了很多事情,这些事情涉及到Node.js的包管理、网络传输、依赖分析与解析等方面。本文将从这些方面介绍针对 npm install 核心机制的一些优化技巧,以帮助大家更好地理解这个过程,以及如何在实际开发中提高 npm install 的效率。 NPM的包管理 NPM执行 npm install 命令时,…

    node js 2023年6月8日
    00
  • 基于node.js依赖express解析post请求四种数据格式

    安装express依赖 在使用express解析post请求时,需要安装express依赖。可以使用npm进行安装,命令如下: npm install express express处理post请求 Express提供了内置的中间件函数,可以轻松处理HTTP请求中的各种数据格式,包括post请求的四种数据格式。 我们可以使用express的app.post方…

    node js 2023年6月8日
    00
  • node koa2 ssr项目搭建的方法步骤

    下面我将详细讲解“node koa2 ssr项目搭建的方法步骤”的完整攻略。 一、准备工作 在开始搭建SSR项目之前,需要确保本地环境已经包含了Node.js和npm工具。如果你的电脑上还没有安装这两个工具,可以到官网下载安装。 二、创建项目 创建一个项目文件夹 打开终端,进入你的工作目录,执行以下命令: mkdir ssr-project &&am…

    node js 2023年6月8日
    00
  • npm安装依赖报错ERESOLVE unable to resolve dependency tree的解决方法

    下面是详细讲解“npm安装依赖报错ERESOLVE unable to resolve dependency tree的解决方法”的完整攻略。 问题背景 在使用npm安装依赖时,有时会出现如下错误提示: npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm…

    node js 2023年6月8日
    00
  • nodejs插件及用法整理

    下面是一份详细讲解 “Node.js插件及用法整理”的攻略: 什么是Node.js插件? Node.js插件是一种可以在Node.js应用程序中使用的扩展功能模块。这些插件通常编写为本地C++模块或NPM模块,它们的目的是在Node.js应用程序中提供更高效的性能和更广泛的功能。 Node.js插件的分类 Node.js插件可以分为两种类型: 基于C++的本…

    node js 2023年6月8日
    00
  • 简单的socket编程入门示例

    下面是详细的“简单的socket编程入门示例”的攻略: 什么是Socket编程 Socket编程是一种基于网络通信协议的编程方式,它可以让程序在网络中传输数据。Socket编程是建立于TCP/IP协议之上的,使用Socket编程可以实现一些网络应用程序,如HTTP、FTP、SMTP等。 Socket编程的基本步骤 Socket编程的基本步骤如下: 创建Soc…

    node js 2023年6月8日
    00
  • 三种Node.js写文件的方式

    谢谢你的提问。下面是关于”三种Node.js写文件的方式”的完整攻略,其中包含两个示例。 一、fs.writeFile方法 将数据写入文件中,如果文件不存在则创建文件,如果文件已存在则完全覆盖其内容。下面是示例: const fs = require(‘fs’); fs.writeFile(‘message.txt’, ‘Hello Node.js’, (e…

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