前端面试题---事件循环机制和异步编程

news2025/1/25 9:04:43

一.JavaScript 中的事件循环(Event Loop)机制。

JavaScript 中的事件循环(Event Loop)是一种用于处理异步操作和事件的机制,它确保代码按照正确的顺序执行,并防止阻塞和死锁。

事件循环的工作原理如下:

  1. JavaScript 引擎会先执行同步代码,按照顺序执行函数调用和表达式求值,直到遇到异步操作或事件。

  2. 当遇到异步操作或事件时,它们将被放置在相应的任务队列(Task Queue)中,而不会立即执行。常见的任务队列包括:

    • 宏任务队列(Macro Task Queue):包括整体的 script 代码、setTimeout、setInterval、I/O 操作等。
    • 微任务队列(Micro Task Queue):包括 Promise 回调、async/await、MutationObserver 等。
  3. 当同步代码执行完毕或遇到空闲时间时,JavaScript 引擎会检查微任务队列,并按照顺序执行队列中的微任务。执行完所有微任务后,才会执行下一轮的宏任务。

  4. 当一个宏任务执行时,如果它产生了新的异步操作或事件,这些新的任务将被放置在相应的任务队列中。

  5. 这个过程会不断重复,形成一个事件循环,直到所有的任务队列都被清空。

简而言之,事件循环负责管理和调度代码的执行顺序,保证同步代码的顺序执行,并在空闲时处理异步操作和事件。它通过任务队列的机制,将异步操作和事件分组并按照优先级顺序执行。 

 

二.如何处理 JavaScript 中的异步编程?请介绍几种异步编程的方法。

在 JavaScript 中,异步编程是处理异步操作(如网络请求、文件读取、定时器等)的常见需求。异步编程可以确保在等待某些操作完成时,JavaScript 程序可以继续执行其他任务,而不会被阻塞。

1.回调函数(Callback)

回调函数是一种传递给异步函数的函数,用于在操作完成后进行处理。异步函数完成后,会调用回调函数并传递结果。回调函数是处理异步操作最基本的方式,但它可能导致回调地狱(Callback Hell)的问题,难以维护和阅读。

function asyncOperation(callback) {
  // 异步操作完成后调用回调函数
  setTimeout(function() {
    var result = '异步操作已完成';
    callback(result);
  }, 1000);
}

asyncOperation(function(result) {
  console.log(result);
});

 2.Promises

Promise 是一种用于处理异步操作的对象,可以通过链式调用的方式进行处理。Promise 可以表示一个异步操作的最终结果,并提供了一些方法来处理操作成功或失败的情况。

function asyncOperation() {
  return new Promise(function(resolve, reject) {
    // 异步操作完成后调用 resolve 或 reject
    setTimeout(function() {
      var result = '异步操作完成';
      resolve(result);
    }, 1000);
  });
}

asyncOperation()
  .then(function(result) {
    console.log(result);
  })
  .catch(function(error) {
    console.error(error);
  });

3.异步/等待(Async/Await)

异步/等待是基于 Promise 的一种更简洁的异步编程方式。它使用 async 关键字定义异步函数,其中可以使用 await 关键字暂停函数的执行,等待 Promise 解决或拒绝。

async function asyncOperation() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      var result = '异步操作已完成';
      resolve(result);
    }, 1000);
  });
}

async function main() {
  try {
    var result = await asyncOperation();
    console.log(result);
  } catch (error) {
    console.error(error);
  }
}

main();

 这些方法都提供了处理异步操作的机制,但选择哪种方法取决于项目的需求和个人的偏好。Promises 和异步/等待通常被认为是更优雅和可读性更好的异步编程方式,因为它们可以避免回调地狱,并提供更好的错误处理机制。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/632020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.Java概述|Java学习笔记

文章目录 Java的诞生Java重要特点JDK、JRE、JVMJava开发注意事项和细节说明注释Java 中的注释类型 Java的诞生 https://www.oracle.com/java/technologies/java-se-support-roadmap.html Java 技术体系平台: Java重要特点 Java 语言是面向对象的(oop)Java 语言…

Dcloud开发者注册,uniCloud服务空间创建。

一、注册dcloud开发者 1、登录dcloud官网,注册开发者账号,官网地址:https://www.dcloud.io/ 二、创建uniCloud服务空间 1、注册完成开发者后,点击开发者后台,点击uniCloud,进入uniCloud服务空间列表&…

shell脚本入门-多命令处理与变量

目录 1.多命令处理2.Shell变量Shell变量的介绍2.1 系统环境变量2.2自定义变量自定义局部变量查询变量值语法变量删除 自定义全局变量父子Shell环境介绍 2.3 自定义常量 1.多命令处理 多命令处理的介绍: 就是在Shell脚本文件中编写多个Shell命令 我们现在通过一些需…

自然语言处理实战10-文本处理过程与输入bert模型后的变化

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战10-文本处理过程与输入bert模型后的变化,通过一段文本看看他的整个变化过程,经过怎样得变化才能输入到模型,输入到模型后文本又经过怎样的计算得到最后的结果。看…

逆向工程的未来在哪里?掌握逆向技能,开创新的职业道路!

前言 随着移动互联网的兴起,“APP”成了99%的互联网企业主要运营的产品,知名的例如“支付宝”、“美团”、“滴滴”、“抖音”等。用户基数的不断变大,安全性也经历着巨大的挑战。 app越来越多,也离不开我们的生活,而…

团队管理之性能实施团队日志10

在这一周中基本上遇到了性能实施过程中应该遇得到的复杂的问题。 像堆外内存引发OOM Killer,C coredump,负载该均衡不均衡,主机资源不够用,数据引发TPS抖动,IO引发TPS抖动之类的。 在这个项目中几乎碰到了我之前遇到…

2023Fiddler抓包学习笔记 -- 环境配置及工具栏介绍

一、Fiddler介绍 Fiddler是位于客户端和服务器端的HTTP代理,常用来抓http数据包,可以监控浏览器所有的http和https流量,查看分析请求数据包和响应数据包,伪造请求和响应等功能。 二、下载安装 1、下载地址 https://www.teleri…

企业——缺省路由

缺省路由是目的地址和掩码全为0的特殊路由 如果报文的目的地址无法匹配路由表中的任何一项,路由器将选择依照缺省路由来转发报文。 ip route-static 0.0.0.0 0.0.0.0 实验要求: 1、按照图中的要求配置IP 2、要求使用静态协议缺省实现访问2.0、3.0、…

linux时间同步,ntpd、ntpdate

linux时间同步,ntpd、ntpdate 一.Linux系统时间的设置二.Linux硬件时间的设置三.系统时间和硬件时间的同步四.不同机器之间的时间同步(重点)五.ntpd服务的设置六.ntp服务的启动与观察七.具体实践:7.1 NTP的配置7.1.1 配置/etc/ntp.conf7.1.2配置/etc/ntp…

VHDL语法

VHDL完整的、可综合的程序结构,必须包含实体和结构体两个最基本的语言结构。 具体取名由设计者自定,由于实体名实际上表达的是该设计电路的器件名,所以最好根据相应电路的功能来确定, 标识符命名规则: (1)标识符主要由字母、数字…

2023年中职组“网络安全”赛项南昌市竞赛任务书

2023年中职组“网络安全”赛项 南昌市竞赛任务书 网络空间安全赛项规程 一、赛项名称 赛项名称:网络空间安全 赛项组别:中职组 二、竞赛目的 通过竞赛,检验参赛选手对网络、服务器系统等网络空间中各个信息系统的安全防护能力&#xff0…

重用Playbook

文章目录 重用Playbookinclude语句如何写role默认变量和普通变量的区别tasks/main.yaml 如何使用变量、静态文件和模板使用x/*/main.yaml中的变量使用x/*/other_but_main.yaml中的资源 role的依赖 重用Playbook Ansible支持的两种重用机制是Roles和Includes。 Roles是一种可重…

【RuoYi-Cloud-Plus】学习笔记 06 - Sentinel(一)关于 StatisticSlot 以及 LeapArray

文章目录 前言参考目录学习笔记1、Sentinel 简介2、Sentinel 架构图3、Sentinel 源码学习3.1、包结构3.2、 LeapArray (滑动窗口算法的实现)3.3、StatisticSlot3.3.1、StatisticSlot#entry3.3.2、StatisticSlot#exit3.4、StatisticNode、StatisticSlot、…

Linux——基础网络设置

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。 个人主页:小李会科技的…

几个事件的问题

1.PC端的click是点击事件,移动端的lick会存在300ms延迟 移动端的click是单击事件,单击事件:第一次点击后,监测300ms, 看是否有第二次点击操作,如果有就是单击,如果有就是双击。 如何解决: 单手指事件模型…

Linux 操作系统原理 — tc 流量控制技术解析

目录 文章目录 目录Traffic ControlTraffic Control 的基本实现原理流量处理的三个层面流量处理的关键流程流量队列的类型FIFO 队列PFIFO_FAST 队列SFQ 队列令牌桶队列 Kernel Traffic Control 的工作原理Qdisc(队列描述)Class(分类&#xff…

电子元器件解析之电容(二)——电容分类与应用场景

书接上文:电子元器件解析之电容(一)——定义与性能参数:https://blog.csdn.net/weixin_42837669/article/details/131142286 摘要 本文总结了各种不同介质电容的特性,包括陶瓷电容、电解电容、薄膜电容等;同时对一些特殊场合的电容…

Transformer Block运算量

参考:Swin Transformer论文精读【论文精读】_哔哩哔哩_bilibili 在看朱毅老师讲解Swin Transformer论文时,里面有一个Transformer Block的计算复杂度的推导计算,感觉清晰明了,这里做一下记录,先说一下结果,…

Android:Handler

参考来源 参考来源 参考来源 参考来源 Handler机制(面试版) Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信 handler机制是android系统运行的基础,它采用生产者,消费者模式进行设计。其中生产…

基于SSM的青少年编程学习系统设计与实现

摘 要:在智能技术飞速发展的今天,各国都努力争取在人工智能时代的发展中占据优势,青 少年编程教育就显得格外重要。不过,相比一些青少年编程教育发展更先进的国家,我国青少 年编程教育仍处在初级阶段,很多青…