首页 > 其他分享 >事件循环-

事件循环-

时间:2024-08-01 18:54:55浏览次数:14  
标签:setTimeout console script 队列 任务 循环 事件 执行

事件循环(Event Loop)是JavaScript运行时(例如浏览器或Node.js)的一种机制,用于处理异步编程。它允许非阻塞操作,即使在某些任务需要等待(如网络请求或定时器),JavaScript也可以继续执行其他代码。

事件循环的基本概念

  1. 调用栈(Call Stack)

    • JavaScript是一门单线程语言,这意味着它一次只能执行一个任务。
    • 当函数被调用时,它会被加入到调用栈中。
    • 函数执行完毕后,会从调用栈中弹出。
  2. 任务队列(Task Queue)

    • 异步操作完成后会将其回调函数放入任务队列中。
    • 任务队列分为宏任务(macro-task)和微任务(micro-task)。

宏任务和微任务

  • 宏任务(Macro-task):包括setTimeoutsetIntervalsetImmediate(Node.js特有)、I/O操作、UI渲染等。
  • 微任务(Micro-task):包括Promise的回调函数、MutationObserverprocess.nextTick(Node.js特有)等。

事件循环的工作过程

  1. 执行同步代码:从调用栈中依次执行同步代码,这些代码在一个事件循环周期内执行。
  2. 检查微任务队列:在调用栈为空时,事件循环检查并执行微任务队列中的所有微任务。微任务队列优先于宏任务队列执行。
  3. 执行宏任务:从宏任务队列中取出第一个任务并执行,通常会再次进入调用栈执行同步代码。
  4. 重复以上步骤:事件循环重复以上步骤,不断处理调用栈和任务队列中的任务。

示例解释

console.log('script start');

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

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

console.log('script end');

执行流程如下:

  1. console.log('script start') 被执行并打印:"script start"。
  2. setTimeout 回调被注册并放入宏任务队列。
  3. Promise.resolve().then 回调被注册并放入微任务队列。
  4. console.log('script end') 被执行并打印:"script end"。
  5. 调用栈为空,开始检查微任务队列。
    • 执行第一个微任务promise1回调,打印:"promise1"。
    • promise2回调被注册并放入微任务队列。
    • 执行第二个微任务promise2回调,打印:"promise2"。
  6. 微任务队列为空,开始执行宏任务队列中的任务。
    • 执行setTimeout回调,打印:"setTimeout"。

最终输出顺序为:

script start
script end
promise1
promise2
setTimeout

事件循环在浏览器和Node.js中的差异

  • 浏览器:事件循环主要用于处理用户交互、DOM操作、网络请求等。
  • Node.js:事件循环用于处理I/O操作、定时器、回调等,分为多个阶段(timers、pending callbacks、poll、check、close callbacks等)。

事件循环使得JavaScript可以高效地处理异步操作,通过将异步任务分配到任务队列,并在主线程空闲时进行处理,确保了非阻塞的执行模型。

标签:setTimeout,console,script,队列,任务,循环,事件,执行
From: https://blog.csdn.net/m0_73882020/article/details/140854918

相关文章

  • 循环结构
    循环结构for循环:格式:for(初始化表达式;条件表达式;更新表达式){//循环体}使用:适合于已知循环次数的情况。while循环:格式:while(条件表达式){//循环体}使用:适合于循环次数未知,但需要在循环开始前检查条件的情况。do-while循环:......
  • Gartner 魔力象限:安全信息和事件管理 (SIEM) 2024
    GartnerMagicQuadrantforSecurityInformationandEventManagement2024Gartner魔力象限:安全信息和事件管理2024请访问原文链接:https://sysin.org/blog/gartner-magic-quadrant-siem-2024/,查看最新版。原创作品,转载请保留出处。Gartner魔力象限:安全信息和事件管理202......
  • TypeError:ufunc 的循环不支持 dict 类型的参数 0,该类型没有可调用的 sqrt 方法
    我遇到了一个错误:psi_out_norm.append(np.sqrt(sorted_probs))TypeError:loopofufuncdoesnotsupportargument0oftypedictwhichhasnocallablesqrtmethod不知道如何解决此错误。下面是我正在处理的代码:num_qubits=2sorted_probs={'00':0.182613164......
  • C语言——循环语句
            C语言是结构化的程序设计语言,这里的结构是指:顺序结构、循环结构、选择结构。在C语言中,有三种循环语句,下文将一一介绍如何在C语言编程时使用。1.while语句        while语句的语法形式如下:1while(表达式);2{    语句;    }   ......
  • 【每日一题 | 数据结构】循环队列
    题目题型讲解核心:所有的循环队列的题,都使用“圆盘法”,即画图来解决。而不要死记公式!!循环队列即将队列空间想象为一个环形的空间,当front或rear位于线性表的最后一个元素时,再加1会回到第一个元素,如图所示:因此,基于这个特性,我们就可以用取模法来计算队列的最大长度等问题......
  • 在Python中,为什么这个负浮点数能够通过非负while循环测试条件?
    在Python中工作收集用户输入输入需要非负在程序的另一部分成功使用了While条件但现在不明白为什么这个捕获有效输入的测试失败了。print("Howmanygramsofxyzarerequired?")xyz_string=input()xyz=int(float(xyz_string))whilex......
  • Spring循环依赖+案例解析
    什么是Spring中的循环依赖?循环依赖是指两个或者多个bean互相依赖对方,从而形成一个闭环。例如:BeanA依赖于BeanB,而BeanB又依赖于BeanA。可能会导致Spring在尝试创建这些bean实例时出现问题,因为他们互相等待对方被创建,最终导致应用程序无法启动。Spring是如何发现这种循环依赖......
  • 我必须每秒捕获一帧的时间戳,但无法捕获整个事件。我能得到的最接近日期是“YYYY-MM-DD
    我正在尝试从左上角的一帧速率的视频中获取时间戳。我只能得到日期,不能得到整个时间戳。帮我获取整个时间戳我正在共享一个在预处理视频后得到的窗口。我本来希望获得整个时间戳,但我无法做到。我想要一个json文件中的整个时间戳,例如“2024-03-2916:36:20”,并且每个帧都......
  • 前端——jQuery中的事件与动画
    jQuery事件事件组成在jQuery中,一个事件由事件主体、事件类型、事件处理函数三个部分组成。//实现事件$("#button").click(function(){//...})//调用事件$("#button").click();鼠标事件常用的鼠标事件方法方法                  ......
  • 游标、循环、定义变量等的使用
    一、生产上的一次需求现有存量的一些数据需要刷数:根据客户表找到注销状态的客户号,循环这些客户号,将客户关联的账号表也一起注销掉、将客户关联的证件映射表也一起删除掉。账号表、和证件映射表都是分表的,从0~29,客户表也是分表一样。写了个批量执行的脚本:/**找到客户表中状态......