首页 > 其他分享 >任务队列与事件循环

任务队列与事件循环

时间:2023-02-13 17:26:00浏览次数:36  
标签:异步 队列 JS 任务 循环 事件 执行 代码执行

任务队列与事件循环

JS是单线程,为了防止线程的阻塞,在代码执行时分为同步任务和异步任务。所有同步任务在主线程上执行,推入栈中执行,当执行栈为空时就回去去事件队列中执行异步任务,而异步任务形成一个新的任务队列,任务队列中的异步任务分为宏任务和微任务,任务队列中微任务的优先级大于宏任务。

什么是任务队列

简言之,JS任务分为同步任务和异步任务,同步代码在栈中同步执行,其中异步任务又分为宏任务和微任务,微任务执行执行完后才会执行宏任务。

另外这里的执行栈与存储数据类型的栈的概念是不同的,JS代码执行时会生成执行上下文(执行环境)。JS代码执行过程中不停的将执行上下文压入栈中,遵循先进后出。

什么是事件循环

不进入主线程,而是进入任务队列,当主线程中的任务执行完毕,就从任务队列中取出任务放进主线程中来进行执行。由于主线程不断重复的获得任务、执行任务、再获取再执行,所以者种机制被叫做事件循环(Event Loop)

宏任务

浏览器为了能够使得JS内部任务与DOM任务能够有序的执行,会在一个任务执行结束后,在下一个任务执行开始前,对页面进行重新渲染

常见的宏任务有 定时器,ajax,读取文件,dom事件,setImmediate(Node.js 环境),requestAnimationFrame,I/0,UI交互,postMessage

微任务

微任务(microtask)是宏任务中的一个部分,它的执行时机是在同步代码执行之后,下一个宏任务执行之前。

常见的微任务有,Promise.then,Object.observe,MutationObserver,process.nextTick(Node.js 环境)

任务执行过程

  1. 所有任务都在主进程上执行,异步任务会经历2个阶段 Event Table和Event Queue

  2. 同步任务在主进程排队执行,异步任务(包括宏任务和微任务)在事件队列排队等待进入主进程执行

  3. 遇到宏任务推进宏任务队列,遇到微任务推进微任务队列

  4. 执行宏任务,执行完宏任务,检查有没有当前层的微任务。

  5. 继续执行下一个宏任务,然后执行对应层次的微任务,直到全部执行完毕。

标签:异步,队列,JS,任务,循环,事件,执行,代码执行
From: https://www.cnblogs.com/wanglei1900/p/17117016.html

相关文章

  • 代码随想录算法训练营Day12 栈与队列
    代码随想录算法训练营代码随想录算法训练营Day12栈与队列|239.滑动窗口最大值 347.前K个高频元素 总结239.滑动窗口最大值给定一个数组nums,有一个大小为 k......
  • 前端面试题:如何实现事件总线 Event Bus
    前端面试题:如何实现事件总线EventBus介绍通常作为多个模块间的通信机制,相当于一个事件管理中心,一个模块发送消息,其它模块接受消息,就达到了通信的作用。原理本质上是......
  • 代码随想录算法训练营Day12 栈与队列
    代码随想录算法训练营代码随想录算法训练营Day12栈与队列|239.滑动窗口最大值 347.前K个高频元素 总结239.滑动窗口最大值给定一个数组nums,有一个大小为 k......
  • 消息队列(Message Queue)
    消息队列​​1.1.MQ的相关概念​​​​1.1.1.什么是MQ​​​​1.1.2.为什么要用MQ​​​​1.1.3MQ的分类​​​​1.1.4.MQ的选择​​1.1.MQ的相关概念1.1.1.什......
  • 面试难题:Spring AOP循环依赖,如何解决?
    面试难题:SpringAOP循环依赖,如何解决?问:Spring如何解决循环依赖?答:Spring通过提前曝光机制,利用三级缓存解决循环依赖(这原理还是挺简单的,参考:三级缓存、图解循环依赖原......
  • Layer中使用事件
    前端一直以来都没怎么研究过,正好手头有个项目需要自己独立完成。项目使用的前端框架是LayUI,之前听过,不过一直都没有接触。最近遇到的一个问题是,弹出Layer,有个功能需要在这......
  • 事件对象与target属性 js 230213
    事件对象target属性它代表了事件针对的目标它有时与this是一样的有时与this是不一样的......
  • 我这.NET菜鸟,用它开发RabbitMQ消息队列后,竟被老板一夜提拔为架构师
    【讲故事】自2022年末推出此工具以来,相关文章已被圈内顶尖的几家.NET头条号转载,而且短短数月,已有超100个团队/个人开发者使用它来操控RabbitMQ消息队列,反响可谓十分火爆。......
  • 两个单向循环链表的合并(带头结点)
    两个单向循环链表的合并(带头结点)问题引入:已知两个带头结点的单向循环链表,LA和LB分别是链表的头指针,LA=(a1,a2…am),LB=(b1,b2,…bm),编写算法,将LA和LB合并成一个单......
  • 顺序循环队列(只设尾指针和所含元素个数)
    问题引入:假设以一维数组elem[0…m-1]存储循环队列的元素,同时设变量rear和quelen分别指示循环队列中队尾元素的位置和队列中所含元素个数。(1)说明该队列特点(2)给出......