浅谈javascript事件环微任务和宏任务队列原理

下面是关于“浅谈javascript事件环微任务和宏任务队列原理”的完整攻略:

什么是事件循环?

事件循环是 JavaScript 的一种机制,它用于控制JavaScript代码的执行顺序,确保异步任务得到预期的执行结果,保证 JavaScript 是单线程的运行环境。

当执行JavaScript程序时,JavaScript引擎首先会将同步任务压入执行栈中,然后执行栈中的任务按照顺序执行,如果执行过程中遇到了异步任务,会将异步任务回调函数挂起并注册到对应的任务队列中等待执行。JavaScript 引擎将同步任务执行完毕后,会依次轮询各个任务队列中的任务并将任务放入执行栈中,等待执行。

宏任务

宏任务是 JavaScript 执行模型中的概念,顾名思义,大的任务就可以称之为宏任务。例如:browser UI rendering、用户输入、setTimeout 和 setInterval 等。

宏任务通过 Event Loop 机制可以异步地等待、等到当前执行栈被清空后再进入执行栈。

示例代码:

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

输出结果为:1 3 2

执行顺序是按照函数调用顺序执行的,当执行 setTimeout() 函数时,会将该任务放入任务队列,由于是异步任务,因此不会阻塞执行栈的执行。当执行完 console.log(3) 后,执行栈为空,JavaScript 引擎会轮询任务队列并将任务放入执行栈中执行。此时,setTimeout() 函数的回调函数会被执行,程序会输出 2

微任务

微任务是 JavaScript 执行模型中的概念,大部分的异步任务都可以称之为微任务,例如:Promise、process.nextTick等。

与宏任务不同的是,微任务会在本轮事件循环的末尾执行,这就确保了宏任务和微任务之间的顺序关系。

示例代码:

console.log(1);
Promise.resolve('promise').then(data => console.log(data));
console.log(2);

输出结果为:1 2 promise

当调用 Promise.resolve() 时,会将该任务变成一个微任务,并将其放入微任务队列中。当执行完 console.log(2) 后,执行栈为空,JavaScript 引擎会检查是否存在微任务,如果存在,则会依次执行微任务队列中的所有任务,最后输出 promise

任务队列

任务队列其实就是一个数组,它存储了异步任务,并按照任务的到达顺序排列。事件循环的时候会在任务队列中查找任务并将任务放入执行栈中等待执行。

常见的任务队列包括以下几种:

  • 宏任务队列:setTimeout、setInterval、requestAnimationFrame、I/O、UI rendering
  • 微任务队列:Promise、process.nextTick

深入透彻掌握事件循环原理

JavaScript 的事件循环机制非常重要,能够掌握事件循环的原理可以帮助开发者更好的理解 JavaScript 异步编程机制。推荐阅读相关书籍或者文档进行深入学习。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈javascript事件环微任务和宏任务队列原理 - Python技术站

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

相关文章

  • ASP.NET Core中的策略授权和ABP授权

    下面是关于“ASP.NET Core中的策略授权和ABP授权”的完整攻略,包含两个示例说明。 简介 在ASP.NET Core中,我们可以使用策略授权和ABP授权来实现身份验证和授权。在本攻略中,我们将介绍如何使用策略授权和ABP授权来提高Web应用程序的安全性。 步骤 在ASP.NET Core中使用策略授权和ABP授权时,我们可以通过以下步骤来实现: 理…

    云计算 2023年5月16日
    00
  • 云计算里AWS和Azure的探究(4)

    云计算里AWS和Azure的探究(4) ——Amazon EC2 和 Windows Azure Virtual Machine   接下来我们来看看Azure VM的创建。Azure里面虚拟机的创建跟AWS比就要简单许多了,配置的东西比较少,创建的过程也相对短一些。 创建虚拟机 首先进入Azure的Management Portal   点击下面的新建按钮…

    云计算 2023年4月12日
    00
  • Python中json.dumps()函数的使用解析

    我来为你讲解一下“Python中json.dumps()函数的使用解析”。 一、什么是json.dumps()函数? json.dumps()函数是Python内置的序列化JSON数据的方法,可以将一个Python数据结构转换为JSON格式的字符串。 1.1 json.dumps()函数的语法格式 json.dumps(obj, skipkeys=False…

    云计算 2023年5月18日
    00
  • js实现跨域的几种方法汇总(图片ping、JSONP和CORS)

    概述 跨域是指在同源策略限制下,客户端无法向不同源(协议、域名、端口)的服务器发送请求。但有些情况下需要跨域请求,这时可以使用以下几种方法:图片ping、JSONP和CORS。 方法一:图片ping 通过创建一个HTML的日志资源文件来达到跨域目的,将数据转化为图片地址,然后请求这个图片地址。 <img src="http://example…

    云计算 2023年5月17日
    00
  • python数据库操作–数据库使用概述

    下面我将为你详细讲解 Python 数据库操作的数据库使用概述。 简介 Python 作为一门语言,具有强大的数据处理能力,因此在数据处理、数据分析等领域都有着广泛的应用。而常见的数据存储方式,就是使用数据库。Python 支持与多种数据库交互,例如 MySQL、SQLite、Oracle 等。 在 Python 中操作数据库需要使用到特定的库,常见的有 p…

    云计算 2023年5月18日
    00
  • 云原生周刊:12 个容易忽略的 Kubernetes 安装错误

    文章推荐 12 个容易忽略的 Kubernetes 安装错误 这篇文章总结了 12 个在 Kubernetes 安装过程中容易忽略但却必须注意的错误。这些错误包括: 没有正确安装 kubectl。 没有正确配置 kubeconfig 文件。 没有正确配置 Kubernetes DNS 解析。 使用了错误的 Pod 子网。 在 Kubernetes Maste…

    云计算 2023年4月17日
    00
  • 云计算平台(数据篇)-MySql高可用平台搭建Master-Slave

    公司MYSQL集群安装环境为Red hat 5或Client OS6.8 MSQL集群软件版本为7.2.8(http://www.mysql.com/downloads/cluster/) MYSQL集群安装 a)         节点配置 1.Wget MYSQL软件包至 /software下 2.对MYSQL软件包进行解压 Tar –zxvf mysql…

    云计算 2023年4月11日
    00
  • 致力于打造下一代去中心化云计算底层操作系统的BHP, 企图打破算力垄断

    云计算作为一种把许多计算资源集合起来,通过软件实现自动化管理,让计算能力如同水电一样让所有人简单取用的商业模式,有效降低了许多中小企业、初创公司的运营成本,不再需要建立自己的机房,同时也为 AWS、Google Cloud、阿里云等巨头带来了丰厚的利润。 但云计算不断发展的同时也带来了算力垄断的问题,一方面,全球网络数据指数型增长,对算力的需求与日俱增,另一…

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