一文详解JS中的事件循环机制

一文详解JS中的事件循环机制

JavaScript 是一门单线程语言,这意味着 JavaScript 代码只能在一个线程中执行。但是,JavaScript 又是一门非常强大的语言,它可以处理各种异步操作,例如网络请求、定时器等。这是因为 JavaScript 中有一个事件循环机制,它可以让 JavaScript 在单线程中处理异步操作。本文将详细讲解 JavaScript 中的事件循环机制,包括事件循环的基本原理、任务队列、宏任务和微任务等概念,以及两个示例说明。

事件循环的基本原理

JavaScript 中的事件循环机制是基于事件循环队列的。事件循环队列是一个先进先出的队列,用于存储 JavaScript 中的任务。当 JavaScript 引擎执行完当前任务后,它会从事件循环队列中取出下一个任务并执行。这个过程会一直重复,直到事件循环队列为空。

任务队列

JavaScript 中的任务分为两种:宏任务和微任务。宏任务是指由浏览器或 JavaScript 引擎发起的任务,例如定时器、网络请求、DOM 事件等。微任务是指由 JavaScript 代码发起的任务,例如 Promise、MutationObserver 等。

JavaScript 中有两个任务队列:宏任务队列和微任务队列。当 JavaScript 引擎执行完一个宏任务后,它会先执行微任务队列中的所有任务,然后再从宏任务队列中取出下一个任务并执行。这个过程会一直重复,直到事件循环队列为空。

宏任务和微任务

宏任务和微任务的区别在于它们的执行顺序。当 JavaScript 引擎执行完一个宏任务后,它会先执行微任务队列中的所有任务,然后再执行下一个宏任务。这意味着微任务的优先级比宏任务高。

下面是两个示例,分别演示了宏任务和微任务的执行顺序。

示例一:宏任务和微任务的执行顺序

在这个示例中,我们演示了宏任务和微任务的执行顺序。首先,我们使用 setTimeout() 函数创建了一个定时器,它会在 0 秒后向宏任务队列中添加一个任务。然后,我们使用 Promise.resolve() 函数创建了一个 Promise 对象,它会在微任务队列中添加一个任务。最后,我们输出了一条信息,它会在当前任务执行完后立即执行。例如:

console.log('start');

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

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

console.log('end');

在上面的代码中,我们首先输出了一条信息 "start",然后向宏任务队列中添加了一个定时器任务和向微任务队列中添加了一个 Promise 任务。最后,我们输出了一条信息 "end"。

当 JavaScript 引擎执行完当前任务后,它会先执行微任务队列中的所有任务,然后再执行宏任务队列中的任务。因此,上面的代码会先输出 "start" 和 "end",然后输出 "Promise" 和 "setTimeout"。

示例二:异步操作的执行顺序

在这个示例中,我们演示了异步操作的执行顺序。首先,我们使用 setTimeout() 函数创建了一个定时器,它会在 0 秒后向宏任务队列中添加一个任务。然后,我们使用 Promise.resolve() 函数创建了一个 Promise 对象,它会在微任务队列中添加一个任务。最后,我们在 Promise 对象的回调函数中又创建了一个 Promise 对象,它也会在微任务队列中添加一个任务。例如:

console.log('start');

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

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

console.log('end');

在上面的代码中,我们首先输出了一条信息 "start",然后向宏任务队列中添加了一个定时器任务和向微任务队列中添加了一个 Promise 任务。在 Promise 任务的回调函数中,我们又向微任务队列中添加了一个 Promise 任务。最后,我们输出了一条信息 "end"。

当 JavaScript 引擎执行完当前任务后,它会先执行微任务队列中的所有任务,然后再执行宏任务队列中的任务。因此,上面的代码会先输出 "start" 和 "end",然后输出 "Promise1" 和 "Promise2",最后输出 "setTimeout"。

总结

JavaScript 中的事件循环机制是基于事件循环队列的。事件循环队列是一个先进先出的队列,用于存储 JavaScript 中的任务。JavaScript 中有两个任务队列:宏任务队列和微任务队列。当 JavaScript 引擎执行完一个宏任务后,它会先执行微任务队列中的所有任务,然后再从宏任务队列中取出下一个任务并执行。宏任务和微任务的区别在于它们的执行顺序。当 JavaScript 引擎执行完一个宏任务后,它会先执行微任务队列中的所有任务,然后再执行下一个宏任务。这意味着微任务的优先级比宏任务高。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文详解JS中的事件循环机制 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 在ASP.NET Core Mvc集成MarkDown的方法

    当我们需要在ASP.NET Core Mvc中使用Markdown时,可以采用以下简单的步骤进行集成。 添加依赖 首先,我们需要添加Markdown依赖项。打开NuGet包管理器控制台,执行以下命令: Install-Package Markdig 这将安装Markdig Markdown处理库。 创建处理器 接下来,我们需要一个处理器类,将文本转换成Mar…

    云计算 2023年5月17日
    00
  • 云计算的SPI服务模型

    云计算的SPI服务模型 虽然目前对于云计算还没有一个统一的定义,但是大家对云计算的服务模型已有了一个相对统一的认识。我们知道云计算是通过共享资源池的方式来提高资源利用率的。在云计算中,根据其资源池中资源的类别,可以把云计算的服务模型分为三种,即所谓的SPI 模型,如表1.1 所示。 表1.1 SPI模型 资源类别 云计算服务模型(SPI) 应用程序 Soft…

    云计算 2023年4月11日
    00
  • 我眼中的云—为什么叫“云”计算

    我们都大概知道了云计算的内涵,但为什么这样的计算不叫A计算或者B计算呢?集群计算,网格计算,效用计算,公用计算都能从字面上就很好的理解,而云计算能从字面上怎么理解呢?其实有些概念,有些叫法,真的去深究,也没什么大的意义。不过,我们还是去看看为什么叫“云”,毕竟也还有些意思,而且也可以减少一些概念神秘度,不过这种来历多少带有一定的野史色彩,大家不要较真,娱乐娱…

    云计算 2023年4月10日
    00
  • Python ORM框架SQLAlchemy学习笔记之数据查询实例

    下面我将详细讲解“Python ORM框架SQLAlchemy学习笔记之数据查询实例”的完整攻略。 概述 ORM框架是Object Relational Mapping的缩写,翻译成中文叫做对象关系映射。它的作用是在不需要手写查询语句的情况下,让开发者可以用对象的方式操作数据库。SQLAlchemy就是一个Python的ORM框架。 本文将详细讲解在Pyth…

    云计算 2023年5月18日
    00
  • openstack (共享组件) 时间同步服务 云计算openstack共享组件——时间同步服务ntp(2)

      一、标准时间讲解 地球分为东西十二个区域,共计 24 个时区格林威治作为全球标准时间即 (GMT 时间 ),东时区以格林威治时区进行加,而西时区则为减。地球的轨道并非正圆,在加上自转速度逐年递减,因此时间就会有误差在计算时间的时,最准确是使用“原子震荡周期”所计算的物理时钟。这种时钟被称为标准时间即— Coordinated Universal Time…

    云计算 2023年4月10日
    00
  • SpringBoot集成ElasticSearch的示例代码

    SpringBoot集成ElasticSearch的完整攻略 ElasticSearch是一个基于Lucene的搜索引擎,可以快速地存储、搜索和分析大量数据。SpringBoot是一个快速开发框架,可以帮助开发者快速地构建Web应用。本文将介绍如何在SpringBoot中集成ElasticSearch,并提供两个示例说明。 步骤一:添加依赖 在pom.xml…

    云计算 2023年5月16日
    00
  • (8)Amazon云计算核心技术之简单队列服务SQS

    SQS(Simple Queue Service) 简单队列服务是Amazon为解决云计算平台之间不同组件的通信专门设计开发的  1.SQS的基本模型: SQS由3个基本部分组成:系统组件(Component),队列(Queue),消息(Message) (1)系统组件 系统组件是SQS的服务对象,而SQS则是组件之间沟通的桥梁 组件既可以是消息的发送者,也…

    云计算 2023年4月11日
    00
  • server 2012文件共享服务器、域控服务器搭建 server2012共享文件夹权限设置的方法

    Server 2012文件共享服务器、域控服务器搭建及文件夹权限设置方法 在Windows Server 2012上搭建文件共享服务器和域控服务器是非常常见的操作。本文将介绍如何在Windows Server 2012上搭建文件共享服务器和域控服务器,并详细说明如何设置共享文件夹的权限。 1. 搭建文件共享服务器 1.1 安装文件共享服务 首先,需要安装文件…

    云计算 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部