【前端每日基础】day28——async/await

async/await 是ES2017(ES8)引入的用于处理异步操作的语法糖,基于Promise实现。它使得异步代码看起来像同步代码,从而提高了代码的可读性和可维护性。以下是对 async/await 的详细讲解。

基本语法
async 函数
在一个函数前加上 async 关键字,使其成为一个 async 函数。一个 async 函数总是返回一个 Promise 对象。如果函数返回一个非 Promise 的值,该值会被自动封装在一个 Promise.resolve 中。

async function foo() {return 42;
}foo().then(result => {console.log(result); // 输出 42
});

await 关键字
await 关键字只能在 async 函数中使用。它会暂停 async 函数的执行,等待一个 Promise 对象的解决(或拒绝),然后继续执行函数,并返回 Promise 解决的值。如果等待的不是 Promise 对象,它会直接返回该值。

async function foo() {let promise = new Promise((resolve, reject) => {setTimeout(() => resolve("Done!"), 1000);});let result = await promise; // 等待,直到promise解决console.log(result); // 输出 "Done!"
}

foo();
错误处理
使用 try…catch 语句来处理 async 函数中的错误。这使得错误处理更加直观。

async function foo() {try {let promise = new Promise((resolve, reject) => {setTimeout(() => reject("Something went wrong!"), 1000);});let result = await promise; // 这里会抛出一个异常console.log(result); // 不会执行到这里} catch (error) {console.error(error); // 输出 "Something went wrong!"}
}

foo();
示例:获取数据并处理
假设我们有一个函数 fetchData,它返回一个 Promise,模拟从服务器获取数据。

function fetchData() {return new Promise((resolve, reject) => {setTimeout(() => {let success = true; // 模拟成功或失败if (success) {resolve({ data: "Server data" });} else {reject("Failed to fetch data");}}, 1000);});
}

使用 async/await 处理异步数据获取和处理:

async function processData() {try {let response = await fetchData();console.log(response.data); // 输出 "Server data"// 进一步处理数据let processedData = `Processed: ${response.data}`;console.log(processedData); // 输出 "Processed: Server data"return processedData;} catch (error) {console.error(error); // 输出错误信息} finally {console.log("Fetch operation completed."); // 无论成功或失败都会执行}
}processData().then(result => {console.log(result); // 输出 "Processed: Server data"
});

多个 await 操作
你可以在 async 函数中使用多个 await 来依次等待多个异步操作的完成:

async function multipleAsyncOperations() {let data1 = await fetchData();console.log(data1.data); // 输出 "Server data"let data2 = await anotherAsyncOperation();console.log(data2.data); // 输出 "Another data"return [data1, data2];
}multipleAsyncOperations().then(result => {console.log(result); // 输出 [data1, data2]
});

并行执行异步操作
如果多个异步操作之间没有依赖关系,可以使用 Promise.all 来并行执行它们,从而提高效率:

async function parallelAsyncOperations() {let promise1 = fetchData();let promise2 = anotherAsyncOperation();let [data1, data2] = await Promise.all([promise1, promise2]);console.log(data1.data); // 输出 "Server data"console.log(data2.data); // 输出 "Another data"
}

parallelAsyncOperations();
注意事项
await 只能在 async 函数中使用:在 async 函数之外使用 await 会导致语法错误。
错误处理:使用 try…catch 块来捕获和处理 await 操作中的错误。
避免阻塞:虽然 async/await 使得代码看起来像同步代码,但它仍然是异步的,不会阻塞事件循环。
示例:综合使用
以下是一个综合示例,展示了如何使用 async/await 进行数据获取、处理和错误处理。

// 模拟异步数据获取函数
function fetchData() {return new Promise((resolve, reject) => {setTimeout(() => {let success = true;if (success) {resolve({ data: "Server data" });} else {reject("Failed to fetch data");}}, 1000);});
}// 另一个模拟异步操作函数
function anotherAsyncOperation() {return new Promise((resolve, reject) => {setTimeout(() => {let success = true;if (success) {resolve({ data: "Another data" });} else {reject("Failed another operation");}}, 1000);});
}// 综合使用async/await处理多个异步操作
async function processData() {try {console.log("Fetching data...");let data = await fetchData();console.log("Data received:", data.data);console.log("Performing another async operation...");let anotherData = await anotherAsyncOperation();console.log("Another data received:", anotherData.data);let combinedData = `${data.data} & ${anotherData.data}`;console.log("Combined data:", combinedData);return combinedData;} catch (error) {console.error("Error occurred:", error);} finally {console.log("Process completed.");}
}// 调用综合函数
processData().then(result => {console.log("Final result:", result);
});

以上内容涵盖了 async/await 的基本用法、错误处理、多 await 操作、并行执行以及注意事项。掌握这些内容有助于更高效地编写和理解异步JavaScript代码。

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

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

相关文章

条件竞争漏洞

条件竞争漏洞 postMessage的客户端竞争条件 Summary AppCache可以被利用来强制浏览器加载后备的HTML页面,允许像Cookie填充(stuffing)这样的攻击,迫使出错并泄露敏感的URL。在负责任披露后,这个问题已经在各大浏览器中得到修复。对AWS S3和Google Cloud等云存储的上传策略(u…

随笔(一)——项目代码优化

文章目录 前言一、if判断点对象赋值1.需求2.原本方法3.优化方法 二、数组的inclueles方法的使用1.需求2.原本方法3.优化方法 三、数组对象的按顺序渲染Object.entries0. Object.entries的基本使用1.需求2.原本方法3.优化方法4. 问题 前言 提示: 一、if判断点对象赋…

《Intel开发手册卷3》读书笔记3

1、中断和异常的概述 中断和异常是强制性的执行流的转移,从当前正在执行的程序或任务转移到一个特殊的称作句柄的例程或任务。当硬件发出信号时,便产生中断,中断的产生同正在执行的程序是异步的,即中断的产生是随机的。其用于处理…

青藤HIDS一键安装

0x00 前言 最近文章更新频率低了,因为发现版权保护太差了,有些博主转载我文章发布原创,并给自己的课程或公众号引流,我们这些博主写文章不图赚钱,只为了点流量,到头来却发现流量也被剽窃,遇到几…

如何使用Vue和Markdown实现博客功能

创建Vue项目和安装依赖 npm install -g @vue/cli vue create vue-blog cd vue-blog npm install vue-markdown-loader --save-dev配置Vue项目以解析Markdown 在 vue.config.js 文件中添加以下配置: module.exports = {chainWebpack: config => {config

JVM(四)

在上一篇中,介绍了JVM组件中的运行时数据区域,这一篇主要介绍垃圾回收器 JVM架构图: 1、垃圾回收概述 在第一篇中介绍JVM特点时,有提到过内存管理,即Java语言相对于C,C进行的优化,可以在适当的…

【Postman接口测试】第四节.Postman接口测试项目实战(上)

文章目录 前言一、项目介绍 1.1 项目界面功能介绍 1.2 项目测试接口介绍 1.3 项目测试接口流程二、HTTP协议三、接口测试中接口规范四、项目合同新增业务介绍 4.1 登录接口调试 4.1 登录接口自动关联 4.1 添加课程接口调试 4.1 上传合同…

Leetcode算法题笔记(3)

目录 矩阵101. 生命游戏解法一解法二 栈102. 移掉 K 位数字解法一 103. 去除重复字母解法一 矩阵 101. 生命游戏 根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子…

.NET 直连SAP HANA数据库

前言 上个项目碰到的需求,IT部门要求直连SAP的HANA数据库,以只读的权限读取SAP部门开发的CDS视图,是个有点复杂的工程,需要从成品一直往前追溯到原材料的产地,和交货单、工单、采购订单有相当程度上的关联 IT部门要求…

基于java实现图片中任意封闭区域识别

需求: 在浏览器中给用户呈现一张图片,用户点击图片中的某些标志物,需要系统给出标志物的信息反馈,达到一个交互的作用。 比如下图中,点击某个封闭区域时候,需要告知用户点击的区域名称及图形形状特性等等。…

2024华为OD机试真题-素数之积-C++-OD统一考试(C卷D卷)

题目描述 RSA加密算法在网络安全世界中无处不在,它利用了极大整数因数分解的困难度, 数据越大,安全系数越高,给定一个32位正整数,请对其进行因数分解, 找出是哪两个素数的乘积。 输入描述 一个正整数num,0 < num <= 2147483647 输出描述 如果成功找到,以单个空格…

【因果推断python】2_因果关系初步2

目录 偏差 关键思想 偏差 偏差是使关联不同于因果关系的原因。幸运的是&#xff0c;我们的直觉很容易理解。让我们在课堂示例中回顾一下我们的平板电脑。当面对声称为孩子提供平板电脑的学校会获得更高考试成绩的说法时&#xff0c;我们可以反驳说&#xff0c;即使没有平板电…

永久代(Permanent Generation)和元空间(Metaspace)

永久代&#xff08;Permanent Generation&#xff09;和元空间&#xff08;Metaspace&#xff09;是Java虚拟机&#xff08;JVM&#xff09;内存管理中的两个概念&#xff0c;主要区别在于它们的实现方式和内存分配策略。 永久代&#xff08;Permanent Generation&#xff09;…

【ai】livekit:Agents 3 : pythonsdk和livekit-agent的可编辑模式下的安装

livekit-agent 依赖于livekit、livekit-api、livekit-protocol 其中livekit就是livekkit-rtc: 包含俩sdk 实时互动sdkReal-time SDK for connecting to LiveKit as a participant livekit-api : 服务端sdk https://pypi.org/project/livekit-api/ livekit的python sdk

如何应对Android面试官 -> 玩转 Fragment

前言 本章主要讲解下 Framgent 的核心原理&#xff1b; 基础用法 线上基础用法&#xff0c;其他的可以自行百度 FragmentManager manager getSupportFragmentManager(); FragmentTransaction transaction manager.beginTransaction(); transaction.add(R.id.contentlayout,…

2018 年山东省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书

2018年山东省职业院校技能大赛高职组 “信息安全管理与评估”赛项任务书 赛项时间 8:30-13:00&#xff0c;共计4小时30分钟&#xff0c;含赛题发放、收卷时间。 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 平台搭建与安全设备配置防护 …

希尔排序(详讲)

目录 个人评价 原理 希尔排序分为两步 例如 间隔大小 时间复杂度 代码 个人评价 一个很天才的想法&#xff0c;对插入排序进行一点更改&#xff0c;代码很简略但是非常的快 和堆排序可以坐在一张桌上 原理 一般的插入排序都是以1为单位进行比较 越有序&#xff0c;插…

茅台领航,贵州白酒向前冲!

执笔 | 尼 奥 编辑 | 扬 灵 “茅台好&#xff0c;大家才好&#xff1b;大家好&#xff0c;茅台才会更好。”在2024年贵州白酒企业盛宴上&#xff0c;这股自信与豪情再度激荡&#xff0c;大家对茅台与贵州白酒产业的未来充满信心。 5月26日至27日&#xff0c;由贵州省白酒产…

一文读懂python同级目录的调用附Demo(详细解读)

目录 前言1. 问题所示2. 原理分析3. 解决方法3.1 添加父目录3.2 相对路径3.3 添加init 前言 通过制作简易的Demo&#xff0c;让其更加深入的了解如何使用 1. 问题所示 发现python的同级目录相互调用会出Bug E:\software\anaconda3\envs\py3.10\python.exe F:\python_project…

internvl-chat部署

简介 InternVL1.5是一个开源的视觉模型&#xff0c;效果接近gpt-4v github地址&#xff1a;https://github.com/OpenGVLab/InternVL 体验地址&#xff1a;https://internvl.opengvlab.com/ 安装 官方推荐使用LMDeploy进行安装&#xff1a;https://lmdeploy.readthedocs.io…