当前位置: 首页 > news >正文

async和await关键字

目录

      • async 关键字
      • await 关键字
      • 使用 async 和 await 解决回调地狱问题
      • 错误处理
      • 总结

在JavaScript中, asyncawait是用于简化基于 Promise的异步编程的关键字。在ES2017(也称为ES8)中引入后,它们迅速成为管理异步代码的首选方法之一,因为它们可以帮助改善代码的可读性和维护性。

async 关键字

async 关键字用于声明一个异步函数,它是一个返回Promise对象的函数。当函数执行时,如果遇到没有显式返回Promise的代码,async函数会自动将其包装在Promise中。
async函数是使用async关键字声明的函数。async 函数是AsyncFunction 构造函数的实例,并且其中允许使用await 关键字。asyneawait 关键字让我们可以用一种更简洁的方式写出基于Promise 的异步行为,而无需刻意地链式调用promise

下面是一个async函数的示例:

async function fetchData() {// 返回值会被包装在Promise中return 'data fetched';
}

调用这个函数实际上返回了一个解析为返回值的Promise

await 关键字

await关键字仅在async函数内部有效,用于等待一个Promise解决(resolve)并返回Promise成果(fulfilled)的值。它可以让异步代码看起来和同步代码类似,因为你可以按照编写同步代码的方式来顺序地写异步代码。

这里有一个await的例子:

async function fetchData() {let data = await someAsyncOperation(); // 等待Promise解决console.log(data); // 使用Promise解决的结果return 'done';
}

这段代码中,await someAsyncOperation()将会暂停fetchData的执行,直到someAsyncOperation()返回的Promise被解决。

使用 async 和 await 解决回调地狱问题


1.概念:在 async 函数内,使用 await 关键字取代 then 函数,等待获取Promise 对象成功状态的结果值

2.做法:使用 async 和 await 解决回调地狱问题

3.核心代码:

/*** 目标:掌握async和await语法,解决回调函数地狱* 概念:在async函数内,使用await关键字,获取Promise对象"成功状态"结果值* 注意:await必须用在async修饰的函数内(await会阻止"异步函数内"代码继续执行,原地等待结果)
*/
// 1. 定义async修饰函数
async function getData() {// 2. await等待Promise对象成功的结果const pObj = await axios({url: 'http://**/api/province'})const pname = pObj.data.list[0]const cObj = await axios({url: 'http://**/api/city', params: { pname }})const cname = cObj.data.list[0]const aObj = await axios({url: 'http://**/api/area', params: { pname, cname }})const areaName = aObj.data.list[0]document.querySelector('.province').innerHTML = pnamedocument.querySelector('.city').innerHTML = cnamedocument.querySelector('.area').innerHTML = areaName
}getData()

使用 await 替代 then 的方法。

错误处理

async/await中,可以使用传统的try/catch语句来处理异常,这使得异步代码的错误处理变得更加直观:

async function fetchDataWithErrorHandling() {try {let data = await someAsyncOperation();console.log(data);} catch (error) {console.error('Error fetching data:', error);}
}

trycatch 的作用:语句标记要尝试的语句块,并指定一个出现异常时抛出的响应

try {// 要执行的代码
} catch (error) {// error 接收的是,错误消息// try 里代码,如果有错误,直接进入这里执行
}

try 里有报错的代码,会立刻跳转到 catch 中

总结

使用async/await可以编写出更清晰、更类似于同步代码的异步JavaScript程序。它消除了Promise.then()链式调用的需要,从而简化了对异步操作的控制流管理。但要记住,为了保持效率,只有在你需要等待异步操作结果的情况下才应该使用await,否则,你可能会不必要地延迟执行。

相关文章:

  • 解析千兆多模光模块SFP-GE-SX
  • 可视化速通知识点
  • kotlin isEmpty/isNotEmpty/isNullOrEmpty和isBlank/isNotBlank/isNullOrBlank
  • 数据结构期末复习(1)数据结构和算法 线性表
  • 个人实际开发心得感悟及学习方法
  • Vue中的组件通信方式及应用场景
  • 2024年道路运输企业主要负责人证考试题库及道路运输企业主要负责人试题解析
  • 各种基础环境搭建
  • Danil Pristupov Fork(强大而易用的Git客户端) for Mac/Windows
  • Keil5,ARM编译器 软件优化注意事项
  • 如何利用firewalld抵御DDOS攻击
  • pyqt6 + pycharm 搭建+使用入门
  • 两个bash函数创建一个数据库
  • C++笔记之cout高亮输出以及纯C++实现一个彩色时钟
  • Python+Django+MySQL的学生信息管理系统【附源码,运行简单】
  • Angular4 模板式表单用法以及验证
  • JavaScript服务器推送技术之 WebSocket
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Rancher如何对接Ceph-RBD块存储
  • vue自定义指令实现v-tap插件
  • 分享一份非常强势的Android面试题
  • 关于springcloud Gateway中的限流
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 前端设计模式
  • 我建了一个叫Hello World的项目
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • python最赚钱的4个方向,你最心动的是哪个?
  • 容器镜像
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #微信小程序(布局、渲染层基础知识)
  • (06)Hive——正则表达式
  • (笔试题)分解质因式
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net refrector
  • .NET 反射的使用
  • .Net语言中的StringBuilder:入门到精通
  • :中兴通讯为何成功
  • @RequestBody与@ModelAttribute
  • @synthesize和@dynamic分别有什么作用?
  • [ActionScript][AS3]小小笔记
  • [BUUCTF]-Reverse:reverse3解析
  • [bzoj 3534][Sdoi2014] 重建
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [kubernetes]控制平面ETCD
  • [leetcode] Multiply Strings
  • [NOIP2005]过河
  • [Oracle]4--查询操作
  • [python 刷题] 2866 Beautiful Towers II