#Js篇:async函数await 命令

news2024/7/6 19:50:08

async函数

定义

是 Generator 函数的语法糖。

Generator 函数的引入为 JavaScript 中异步编程提供了一种更为直观和易于理解的方式

返回

async函数的返回值是Promise对象,

基本用法

使用 async 关键字声明的函数会自动返回一个 Promise 对象,无需手动创建。这使得异步函数更容易与其他异步操作协同工作。

async函数返回一个 Promise 对象,可以使用then方法添加回调函数。

当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

async function f() {
  return 'hello world';
}

f().then(v => console.log(v))
// "hello world"

async函数内部return语句返回的值,会成为then方法回调函数的参数。

上面代码中,函数f内部return命令返回的值,会被then方法回调函数接收到

async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到。

await命令

定义

正常情况下,await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。

错误处理

如果await后面的异步操作出错,那么等同于async函数返回的Promise对象被reject。

防止出错的方法,也是将其放在try...catch代码块之中

如果有多个await命令,可以统一放在try...catch结构中。

async function main() {
  try {
    const val1 = await firstStep();
    const val2 = await secondStep(val1);
    const val3 = await thirdStep(val1, val2);

    console.log('Final: ', val3);
  }
  catch (err) {
    console.error(err);
  }
}
使用注意点

第一点,前面已经说过,await命令后面的Promise对象,运行结果可能是rejected,所以最好把await命令放在try...catch代码块中。

第二点,多个await命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。

上面代码中,getFoogetBar是两个独立的异步操作(即互不依赖),被写成继发关系。这样比较耗时,因为只有getFoo完成以后,才会执行getBar,完全可以让它们同时触发。

// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);

// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;

上面两种写法,getFoogetBar都是同时触发,这样就会缩短程序的执行时间。

第三点,await命令只能用在async函数之中,如果用在普通函数,就会报错。

async 函数与 Promise的区别

  1. 返回值类型:
    • async 函数总是返回一个 Promise 对象。即使在函数内部使用 return 返回非 Promise 类型的值,它也会被隐式地包装成一个解决的 Promise 对象。
    • 普通函数返回的是函数执行的结果,而 async 函数返回的是一个 Promise 对象。
  2. 语法简洁性:
    • async 函数的语法更为简洁,可以使用 await 关键字来等待异步操作的完成,而不需要手动创建 Promise 链。
    • Promise 需要通过 .then().catch() 来处理异步操作的结果,导致可能出现较深的嵌套(回调地狱)。
  3. 错误处理:
    • async 函数内部可以使用 try...catch 来捕获和处理异步操作的错误,使得错误处理更加方便。
    • Promise 中,错误处理通常通过 .catch() 方法,或者在 .then() 中的第二个参数进行。
  4. 使用场景:
    • async 函数适用于更直观地编写异步代码,特别是在处理多个异步操作时。
    • Promise 通常用于处理单一的异步操作,或者在不使用 async/await 语法的情况下进行异步编程。
  5. await 的使用:
    • await 只能在 async 函数内部使用,用于等待一个 Promise 对象解决,并返回其解决值。
    • 在普通函数或全局作用域中,无法使用 await 关键字。
  6. 可读性:
    • 使用 async/await 语法可以使异步代码更加直观和可读,避免了回调地狱,提高了代码的可维护性。
    • Promise 链的可读性较差,尤其是在处理多个异步操作时。

综合来说,async/await 是一种更现代、更清晰的异步编程方式,而 Promise 仍然是底层的异步处理机制,可以在某些场景下继续发挥作用。通常,使用 async/await 更容易理解和维护异步代码。

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

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

相关文章

微信小程序-跳转到另一个小程序

微信小程序-跳转到另一个小程序 微信小程序跳转到另一个小程序有一个条件:这两个小程序被同一个微信公众号关联,否则不能跳转,会报错。 官方文档 wx.navigateToMiniProgram({appId: wxa38r249405b957c6,path: pages/splash/index,//extraData: 需要传递…

Android : PopupWindow 悬浮框_简单应用

示例图: MainActivity.java package com.example.popupwindow;import androidx.appcompat.app.AppCompatActivity;import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.LayoutInflat…

浅谈STL中的分配器

分配器是STL中的六大部件之一,是各大容器能正常运作的关键,但是对于用户而言确是透明的,它似乎更像是一个幕后英雄,永远也不会走到舞台上来,观众几乎看不到它的身影,但是它又如此的重要。作为用户&#xff…

Vue组件的几种通信方式

这里写目录标题 Vue组件的几种通信(数据传递)方式非父子组件间通信(Bus事件总线)介绍实例 非父子通信-provide&inject1.作用2.场景3.语法4.注意 父子组件间的通信固定props属性名(v-model)介绍实例 不固…

【部署运维】docker:入门到进阶

0 前言 部署运维博客系列一共有三篇: 拥抱开源,将工作中的经验分享出来,尽量避免新手踩坑。 【部署运维】docker:入门到进阶 【部署运维】kubernetes:容器集群管理掌握这些就够了 【部署运维】pythonredisceleryd…

C++多态-虚函数

多态分为编译时多态和运行时多态。编译时多态就是在编译阶段就能绑定要执行的那个函 数。运行时多态要等到运行到调用的那条语句时,根据指针/引用所绑定的对象,来决定执行哪 个函数,我们要讲的虚函数就是运行时多态,是 C中非常重…

嵌入式的学习需要合理规划时间

低级的欲望放纵即可获得,高级的欲望只有克制才能达成。——卡耐基1、粉丝的误会 很多粉丝,问我, "胡老师我想报您的培训班。" ... 得知我知识业余时间写文章,紧接着又会问, "jg单位这么清闲啊&#…

带你理解H桥电路

H桥电路 文章目录 H桥电路前言一、H桥基本结构二、H桥原理二、控制模式三、MOS管H桥 前言 在做单片机控制小车的时候一定会用一个电机驱动板,这个电机驱动板是怎么做的呢,答案就是H桥,没学过电路的同学可能会问什么是H桥,这篇文章…

【c++哈夫曼树代码实现】

哈夫曼树是不定长编码方式,由于是将权值大的元素放在离根结点近的地方 ,权值小的放在离根远的地方,哈夫曼树效率很高,并且一个编码不会以另一个编码作为前缀,避免了编码的歧义性,本文将带大家探索如何创建和…

SAP smartform 实现打印条形码

先在SE73里定义一个新的BARCODE,注意一定要用新的才可以,旧的是打印不出来的。 然后定义一个SMARTFORM的样式,把你定义的BARCODE放到字符样式里面去。 再做SMARTFORM就可以了,将需要作为条码的变量的格式选为该BARCODE格式&…

ASP.NET Core 使用 SignalR 实现实时通讯

🐳简介 SignalR是一个用于ASP.NET的库,它允许服务器代码向连接的客户端实时发送推送通知。它使用WebSockets作为底层传输机制,但如果浏览器不支持WebSockets,它会自动回退到其他兼容的技术,如服务器发送事件&#xff…

GEE:众数滤波

作者:CSDN @ _养乐多_ 在本文中,我们将介绍如何使用Google Earth Engine(GEE)平台对遥感影像进行众数滤波处理。并以众数滤波平滑NDVI图像为示例,演示众数滤波整个过程。 结果如下图所示, 文章目录 一、众数滤波二、完整代码三、代码链接一、众数滤波 众数滤波是一种图…

保护您的IP地址:预防IP地址盗用的关键措施

随着互联网的发展,IP地址作为标识互联网设备的重要元素,成为网络通信的基石。然而,IP地址盗用威胁正不断增加,可能导致敏感信息泄露、未经授权的访问和网络攻击。本文将介绍一些有效的方法,以帮助组织和个人预防IP地址…

【外贸干货】领英客户开发与营销的六个策略方向

领英(LinkedIn)已经成为外贸营销人员,尤其是B2B外贸营销人员,一个重要且有效的社交媒体平台。 相比于其他社交媒体平台,领英(LinkedIn)在增加流量、产生高质量的潜在客户和建立思想领导力方面有着独有的优势。 因为领英(LinkedIn)不仅仅是获…

【力扣:1707 1803】0-1字典树

思路:树上每个节点存储拥有该节点的数组元素的最小值,left节点表示0,right节点表示1,构建完成后遍历树当子节点没有比mi小的元素时直接输出-1,否则向下构造。 struct tree{int m;tree*leftnullptr,*rightnullptr;tree…

flink源码分析之功能组件(二)-kubeclient

简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metrics,future。其中kubeclient上一个系列介绍过,为了系列完整性,这里“copy”一下。 kubeclient组件…

ffmpeg下载与配置环境变量

FFmpeg 是一个强大的多媒体框架,可以让用户处理和操纵音频和视频文件。具有易于使用的界面,用户可以在 Windows、Mac 或 Linux Ubuntu 系统上下载 FFmpeg 并将其提取到文件夹中。然后,该软件可以加入 PATH 环境变量中就可以快捷的使用软件了.…

中职组网络安全-Windows操作系统渗透测试 -20221219win(环境+解析)

B-4:Windows操作系统渗透测试 任务环境说明: 服务器场景:20221219win 服务器场景操作系统:Windows(版本不详)(封闭靶机) 1.通过本地PC中渗透测试平台Kali对服务器场景Server08进行系统服务及版本扫描渗透测试,并将该操作显示结果中1433端口对应的服务版本信息作为F…

深度学习之图像分类(十四)CAT: Cross Attention in Vision Transformer详解

IPSA和CPSA的处理流程、维度变换细节 FLOPs的计算方法、以及flops和划分的patch数目以及patch的维度计算关系 IPSA如何进行local attention、CPSA如何进行globe attention CAT的代码详细注释---需要学习完Transformer TNT、swin transformer、crossViT CAT: Cross Atten…

软件测试 | MySQL 非空约束详解

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…