JavaScript中的异步编程:从回调到Promise
在JavaScript中,异步编程是一项至关重要的技能,它允许我们在不阻塞主线程的情况下执行耗时操作,如网络请求、文件读取或定时任务。随着JavaScript的发展,异步编程的模式也在不断演进,从最初的回调函数,到现代的Promise和async/await。本文将带你了解JavaScript异步编程的演变,从回调函数的基础开始,逐步深入到Promise的使用。
一、回调函数:异步编程的起点
在JavaScript中,回调函数是最早的异步编程方式。回调函数是一个函数,它作为参数传递给另一个函数,并在后者完成某个异步操作后被调用。
function fetchData(callback) { setTimeout(() => { // 模拟异步操作,如网络请求 const data = "Hello, World!"; callback(data); }, 1000);
} fetchData((data) => { console.log(data); // 1秒后输出:Hello, World!
});
尽管回调函数简单直接,但当异步操作嵌套时,会导致“回调地狱”(Callback Hell)问题,使代码难以阅读和维护。
二、Promise:解决回调地狱的利器
为了解决回调地狱,ES6引入了Promise对象。Promise代表了一个可能现在还不可用,但将来某一时刻会变得可用的值。Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。
function fetchData() { return new Promise((resolve, reject) => { setTimeout(() => { const success = true; // 假设操作成功 if (success) { resolve("Hello, World!"); } else { reject("Error occurred"); } }, 1000); });
} fetchData() .then((data) => { console.log(data); // 1秒后输出:Hello, World! }) .catch((error) => { console.error(error); });
Promise的链式调用(chaining)特性允许我们处理多个异步操作,而不会陷入回调地狱。
三、Promise的链式调用与错误处理
Promise的.then()
方法用于处理成功的情况,.catch()
方法用于处理错误。Promise还可以链式调用,即一个.then()
方法后可以继续跟另一个.then()
或.catch()
方法。
fetchData() .then((data) => { console.log(data); // 1秒后输出:Hello, World! return processData(data); // 假设processData是另一个异步操作 }) .then((processedData) => { console.log(processedData); }) .catch((error) => { console.error(error); // 捕获整个链中的错误 });
四、Promise.all与Promise.race
Promise.all()
方法接受一个Promise对象的数组,当数组中的所有Promise对象都成功时,它才返回成功的结果;如果有一个失败,则返回失败的结果。
Promise.all([fetchData1(), fetchData2()]) .then(([data1, data2]) => { console.log(data1, data2); }) .catch((error) => { console.error(error); });
Promise.race()
方法则接受一个Promise对象的数组,并返回数组中第一个解决或拒绝的Promise的结果。
Promise.race([fetchData1(), fetchData2()]) .then((data) => { console.log(data); // 输出第一个解决的Promise的结果 }) .catch((error) => { console.error(error); });
五、async/await:异步编程的语法糖
虽然Promise大大简化了异步编程,但then()
和catch()
的链式调用仍然让代码显得有些冗长。为了解决这个问题,ES8引入了async
和await
关键字,它们提供了基于Promise的异步编程的语法糖,使代码看起来更像是同步的。
async function fetchAndProcessData() { try { const data = await fetchData(); const processedData = await processData(data); console.log(processedData); } catch (error) { console.error(error); }
} fetchAndProcessData();
在async
函数中,我们可以使用await
关键字等待一个Promise解决,而不需要使用.then()
和.catch()
。await
关键字只能在async
函数内部使用,并且它会暂停async
函数的执行,直到等待的Promise解决或拒绝。
总结
从回调函数到Promise,再到async/await,JavaScript的异步编程模式经历了巨大的变化。这些变化不仅使代码更加简洁和易读,还提高了异步编程的可靠性和可维护性。掌握这些异步编程模式,对于编写高效、可靠的JavaScript应用至关重要。
相关文章:

JavaScript中的异步编程:从回调到Promise
在JavaScript中,异步编程是一项至关重要的技能,它允许我们在不阻塞主线程的情况下执行耗时操作,如网络请求、文件读取或定时任务。随着JavaScript的发展,异步编程的模式也在不断演进,从最初的回调函数,到现…...

windows下DockerDesktop命令行方式指定目录安装
windows下DockerDesktop指定目录安装(重新安装) 因为DcokerDesktop占用内存较大, 并且拉去镜像后占用本地空间较多,所以建议安装时就更改默认安装路径和镜像存储路径 这里,展示了从下载到安装的过程: 首先下载DcokerDesktop;找到Docker Desktop Installer.exe 并重命名为 do…...

排查和解决JVM OOM实战
JVM OOM介绍 Java内存区域布局 下面的分析中都是基于JDK 8开始的。关于JMM不过多介绍每个区域的作用。OOM不单只会发生在堆内存,也可能是因为元空间或直接内存泄漏导致OOM,此时在OOM的详细信息中会有不同体现。 Java OOM的类别 java.lang.OutOfMemory…...

【Swift官方文档】7.Swift集合类型
集合类型 使用数组、集合和字典来组织数据。Swift 提供了三种主要的集合类型:数组、集合和字典,用于存储值的集合。数组是有序的值集合。集合是无序的唯一值集合。字典是无序的键值对集合。 Swift 中的数组、集合和字典始终清晰地指明它们可以存储的值…...

QT调用最新的libusb库
一:下载libusb文件 下载最新的库的下载网站:https://libusb.info/ 下载: 解压后目录如下: 二:库文件添加QT中 根据自己的编译器选择库: ①将头文件中添加libusb.h ②源文件中添加libusb-1.0.lib ③添加…...

白嫖EarMaster Pro 7简体中文破解版下载永久激活
EarMaster Pro 7 简体中文破解版功能介绍 俗话说得好,想要成为音乐家,就必须先拥有音乐家的耳朵,相信很多小伙伴都已经具备了一定的音乐素养,或者是说想要进一步得到提升。那我们就必须练好听耳的能力,并且把这种能力…...

使用JavaScript写一个网页端的四则运算器
目录 style(内联样式表部分) body部分 html script 总的代码 网页演示 style(内联样式表部分) <style>body {font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;background-color: #f0f0f0;}.calculator {…...

Linux find命令详解及实用示例
Linux 系统中的 find 命令是一个功能强大的工具,用于在文件系统中搜索文件并执行相应的操作。无论是系统管理员还是普通用户,掌握 find 命令都能极大地提高工作效率。本文将详细介绍 find 命令的用法,并通过多个示例展示其在实际中的应用。 …...

CSS基础-常见属性(二)
6、CSS三大特性 6.1 层叠性 如果样式发生冲突,则按照优先级进行覆盖。 6.2 继承性 元素自动继承其父元素、祖先元素所设置的某些元素,优先继承较近的元素。 6.3 优先级 6.3.1 简单分级 1、内联样式2、ID选择器3、类选择器/属性选择器4、标签名选择器/…...

Spring Boot 2.4.3 + Java 8 升级为 Java 21 + Spring Boot 3.2.0
简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Spring Boot 2.4.3 + Java 8 升级为 Java 21 + Spring Boot 3.2.0前言更换 Java 21 SD…...

如何利用免费音频剪辑软件制作出精彩音频
现在有许多免费的音频剪辑软件可供选择,它们为广大用户提供了丰富的功能和便捷的操作体验,让音频编辑变得更加轻松和有趣。接下来,让我们一起走进这些免费音频剪辑软件的世界,探索它们的独特魅力和强大功能。 1.福昕音频剪辑 链…...

安宝特分享 | AR技术重塑工业:数字孪生与沉浸式培训的创新应用
在数字化转型的浪潮中,AR(增强现实)技术与工业的结合正在呈现新的趋势和应用延伸。特别是“数字孪生”概念的崛起,为AR技术在工业中提供了独特而创新的切入点。 本文将探索AR如何与数字孪生、沉浸式体验和实用案例相结合…...

专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
目录 搜索 vs 深度优先遍历 vs 深度优先搜索 vs 宽度优先遍历 vs 宽度优先搜索 vs 暴搜 1.深度优先遍历 vs 深度优先搜索(dfs) 2.宽度优先遍历 vs 宽度优先搜索(bfs) 2.关系图暴力枚举一遍所有的情况 3.拓展搜索问题全排列 决策树 1. 计算布尔⼆叉树的值(medi…...

基于springboot vue3 在线考试系统设计与实现 源码数据库 文档
博主介绍:专注于Java(springboot ssm springcloud等开发框架) vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…...

什么是 HTTP 请求中的 options 请求?
在 Chrome 开发者工具中的 Network 面板看到的 HTTP 方法 OPTIONS,其实是 HTTP 协议的一部分,用于客户端和服务器之间进行“预检”或“协商”。OPTIONS 请求的作用是让客户端能够获取关于服务器支持的 HTTP 方法和其他跨域资源共享 (CORS) 相关的信息&am…...

[图形学]smallpt代码详解(1)
一、简介 本文介绍了著名的99行代码实现全局光照的光线跟踪代码smallpt。 包括对smallpt的功能介绍、编译运行介绍,和对代码的详细解释。希望能够帮助读者更进一步的理解光线跟踪。 二、smallpt介绍 1.smallpt是什么 smallpt(small Path Tracing) 是一个全局光照…...

Vite多环境配置与打包:
环境变量必须以VITE开头 1.VITE_BASE_API: 在开发环境中设置为 /dev-api,这是一个本地 mock 地址,通常用于模拟后端接口。 2.VITE_ENABLE_ERUDA: 设置为 "true",表示启用调试工具,通常是为了…...

git维护【.gitignore文件】
在工程下添加 .gitignore 文件【git忽略文件】 *.class .idea *.iml *.jar /*/target/...

【Canvas与色彩】十六等分多彩隔断圆环
【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>隔断圆环Draft5十六等分多彩</title><style type"text…...

什么是pip? -- Python 包管理工具
前言 不同的编程语言通常都有自己的包管理工具,这些工具旨在简化项目的依赖管理、构建过程和开发效率,同时促进代码的复用和共享。每个包管理工具都有其独特的特点和优势,开发者可以根据自己的编程语言和项目需求选择合适的包管理工具。 pip是…...

FastAPI框架使用枚举来型来限定参数、FastApi框架隐藏没多大意义的Schemes模型部分内容以及常见的WSGI服务器Gunicorn、uWSGI了解
一、FastAPI框架使用枚举来型来限定参数 FastAPI框架验证时,有时需要通过枚举的方式来限定参数只能为某几个值中的一个,这时就可以使用FastAPI框架的枚举类型Enum了。publish:December 23, 2020 -Wednesday 代码如下: #引入Enum模块 from fa…...

OceanBase—02(入门篇——对于单副本单节点,由1个observer扩容为3个observer集群)——之前的记录,当初有的问题未解决,目前新版未尝试
OceanBase—02(入门篇——对于单副本单节点,由1个observer扩容为3个observer集群)——之前的记录,有的问题未解决,新版未尝试 1、前言—安装单副本单节点集群1.1 docker安装OB 2、查看现有集群情况2.1 进入容器&#x…...

前沿论文创新点集合
系列文章目录 文章目录 系列文章目录一、《LAMM: Label Alignment for Multi-Modal Prompt Learning》二、《MaPLe: Multi-modal Prompt Learning》三、《Learning to Prompt for Vision-Language Models》CoOp四、《MobileCLIP: Fast Image-Text Models through Multi-Modal R…...

刷题记录(好题)
Problem - D - Codeforces 思路: 滑动窗口思想,一个数组记录起始点(记录出现过的次数),另一个数组记录截至点(记录出现过的次数),从0开始遍历,设定一个长度为d的滑动窗口…...

【大数据入门 | Hive】函数{单行函数,集合函数,炸裂函数,窗口函数}
1. 函数简介: Hive会将常用的逻辑封装成函数给用户进行使用,类似于Java中的函数。 好处:避免用户反复写逻辑,可以直接拿来使用。 重点:用户需要知道函数叫什么,能做什么。 Hive提供了大量的内置函数&am…...

python sqlite3 工具函数
起因, 目的: sqlite3 最常用的函数。 比如,某人给了一个 database.db 文件。 但是你登录的时候,不知道账号密码。 此文件就是,查看这个数据库的详细内容。 有哪些表某个表的全部内容。添加数据 代码, 见注释 impor…...

顺丰Android面试题集锦及参考答案
TCP 三次握手和四次挥手是什么,挥手过程中主动方的状态是什么? TCP 三次握手是建立连接的过程: 第一次握手:客户端向服务器发送一个 SYN 报文,该报文包含客户端的初始序列号(seq=x)。此时客户端进入 SYN_SENT 状态。第二次握手:服务器收到客户端的 SYN 报文后,向客户端…...

uniapp中检测应用更新的两种方式-升级中心之uni-upgrade-center-app
uniapp一个很是用的功能,就是在我们发布新版本的app后,需要提示用户进行app更新,并告知用户我们新版的app更新信息,以使得用户能及时使用上我们新开发的功能,提升用户的实用度和粘性。注意:这个功能只能在app端使用 效…...

Python爬虫通过 Cookie 和会话管理来维持其在网站上的会话状态
Python 爬虫虽然是一个热门且非常实用的技术领域,但在实际开发中,确实存在一些困难的地方。以下是 Python 爬虫开发中常见的难点和挑战: 1. 处理反爬虫机制 许多网站为防止爬虫的恶意访问,采取了各种反爬虫措施。常见的反爬虫技…...

使用STM32单片机实现无人机控制系统
无人机控制系统是无人机的大脑,负责处理无人机的姿态控制、导航和通信等功能。本文将详细介绍如何使用STM32单片机实现无人机控制系统,包括硬件设计、软件设计、系统调试与测试等内容。 一、系统概述 无人机控制系统通常包括飞行控制器、传感器、执行器…...