ES6第二十章async函数学习笔记

超详细的ES6学习笔记 ES6笔记 1.let和const关键字 2.解构赋值 ​3.函数 4.数组 5.字符串 6. 对象 7. Promise 对象 阅读详情

什么是async函数

一句话,它就是 Generator 函数的语法糖。

async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await,仅此而已。

async的基本用法

async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

async 函数有多种使用形式。

// 函数声明
async function foo() {}

// 函数表达式
const foo = async function () {};

// 对象的方法
let obj = { async foo() {} };
obj.foo().then(...)

// Class 的方法
class Storage {
  constructor() {
    this.cachePromise = caches.open('avatars');
  }

  async getAvatar(name) {
    const cache = await this.cachePromise;
    return cache.match(`/avatars/${name}.jpg`);
  }
}

const storage = new Storage();
storage.getAvatar('jake').then(…);

// 箭头函数
const foo = async () => {};

语法

返回值

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

async function f() {
  // 等同于
  // return 123;
  return await 123;
}

f().then(v => console.log(v))
// 123

上面代码中,await命令的参数是数值123,这时等同于return 123。

返回错误

await命令后面的 Promise 对象如果变为reject状态,则reject的参数会被catch方法的回调函数接收到。

async function f() {
  await Promise.reject('出错了');
}

f()
.then(v => console.log(v))
.catch(e => console.log(e))
// 出错了

注意,上面代码中,await语句前面没有return,但是reject方法的参数依然传入了catch方法的回调函数。这里如果在await前面加上return,效果是一样的。

错误处理

任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行。

async function f() {
  await Promise.reject('出错了');
  await Promise.resolve('hello world'); // 不会执行
}

上面代码中,第二个await语句是不会执行的,因为第一个await语句状态变成了reject。

有时,我们希望即使前一个异步操作失败,也不要中断后面的异步操作。这时可以将第一个await放在try...catch结构里面,这样不管这个异步操作是否成功,第二个await都会执行。

async function f() {
  try {
    await Promise.reject('出错了');
  } catch(e) {
  }
  return await Promise.resolve('hello world');
}

f()
.then(v => console.log(v))
// hello world
并发执行
async function logInOrder(urls) {
  for (const url of urls) {
    const response = await fetch(url);
    console.log(await response.text());
  }
}

上面代码所有远程操作都是继发。只有前一个 URL 返回结果,才会去读取下一个 URL,这样做效率很差,非常浪费时间。我们需要的是并发发出远程请求。

async function logInOrder(urls) {
  // 并发读取远程URL
  const textPromises = urls.map(async url => {
    const response = await fetch(url);
    return response.text();
  });

  // 按次序输出
  for (const textPromise of textPromises) {
    console.log(await textPromise);
  }
}

上面代码中,虽然map方法的参数是async函数,但它是并发执行的,因为只有async函数内部是继发执行,外部不受影响。后面的for..of循环内部使用了await,因此实现了按顺序输出。

顶层await

在引入的模块中使用await不需要async函数体内。

下面是顶层await的一些使用场景。

// import() 方法加载
const strings = await import(`/i18n/${navigator.language}`);

// 数据库操作
const connection = await dbConnector();

// 依赖回滚
let jQuery;
try {
  jQuery = await import('https://cdn-a.com/jQuery');
} catch {
  jQuery = await import('https://cdn-b.com/jQuery');
}

注意,如果加载多个包含顶层await命令的模块,加载命令是同步执行的。

// x.js
console.log("X1");
await new Promise(r => setTimeout(r, 1000));
console.log("X2");

// y.js
console.log("Y");

// z.js
import "./x.js";
import "./y.js";
console.log("Z");

上面代码有三个模块,最后的z.js加载x.js和y.js,打印结果是X1、Y、X2、Z。这说明,z.js并没有等待x.js加载完成,再去加载y.js。

顶层的await命令有点像,交出代码的执行权给其他的模块加载,等异步操作完成后,再拿回执行权,继续向下执行。

ESP32连接OneNet云平台实现多设备联动控制完整示例 通过esp32连接onenet云平台,实现远程设备间的智能联动控制,利用MQTT协议完成数据通信,esp32连接onenet云平台后可高效稳定地上传与下发指令,提升物联网系统响应速度与自动化水平。 阅读详情

相关推荐

【2026-Spark实验一-Windows中安装Spark环境】

本文详细介绍了在Windows系统中配置Spark 3.5.8开发环境的完整流程。主要内容包括:安装JDK 8并配置环境变量,下载并解压Spark 3.5.8预编译版,设置SPARK_HOME系统变量,配置Hadoop的winutils工具解决Windows兼容性问题。通过spark-shell和SparkPi示例程序验证环境配置成功,确保Spark能够正常运行分布式计算任务。文中特别强调了路径命名规范、环境变量设置顺序等关键细节,提供了完整的配置截图和验证方法,帮助开发者快速搭建稳定的Spark学习环境。

pblh123的专栏 1587

ES6——async 和 await

ES7新增 async 和 await

m0_62348004的博客 270

5分钟搞懂语义通信:如何用深度学习让AI理解你的真实意图?

本文深入解析了语义通信如何利用深度学习技术,实现从传统‘比特保真’到‘语义保真’的范式转移。通过介绍基于神经网络的端到端系统架构、编解码技术及实战案例,阐明AI如何理解并高效传递信息核心意图,为6G时代的人机交互奠定基础。

weixin_29191669的博客 263

你不知道的并发/继发请求操作

你需要知道的知识 async是 Generator 函数的语法糖,总是返回一个promise。 async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。 正常情况下,await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。 继发请求 使用 for循

liusixsixsix的博客 468

两层板如何做阻抗控制呢

两层板如何做阻抗控制呢? 这个问题可能很多人都会碰到,有的人在此等需要做阻抗控制的情况都选择做多层板。诚然,多层板在阻抗控制,EMC等等方面都有着天然的优势。然而,在价格上和周期上,两层板就有着绝对优势了。 对于成本非常敏感而又不是太复杂的产品,尽管对于我们硬件工程师而言,有一堆的理由要求使用多层板。然而在面对毛都不懂的老板“别人能做,你为什么不能做?”这个问题时只得低下我们高傲的头颅。 好...

weixin_42005993的博客 2万+

【agent实操】OpenClaw玩转股票分析多个AI智能体(agent)出谋划策

本文介绍了一个基于OpenClaw的多Agent股票分析系统。该系统采用"三人组+总调度"模式,包含三个核心Agent:小牛马(策略中枢)、牛老二(基本面分析师)和牛老三(技术面分析师)。相比单Agent模式,该系统具有分析更专业、权限分级更安全、成本控制更优等优势。文章详细说明了系统部署的6个步骤,包括创建独立Agent工作区、配置专属人设与技能等,并提供了环境检查命令和验证方法。通过这种多Agent协作的方式,可以实现更专业、更安全的股票分析。

海兰 807

async函数

一,

过客如期的博客 1万+

把 SAP ABAP BDC 跑得又快又稳:从 SHDB 录屏到可上线的批量上传程序(含 MM01 案例与源码)

SAP BDC批量数据迁移实践 摘要:本文介绍了SAP系统中BDC(Batch Data Communication)技术在数据迁移中的应用。文章首先对比了Session method和CALL TRANSACTION method两种实现方式的特点及适用场景,重点推荐使用Session method进行主数据批量处理。然后详细讲解了通过SHDB工具录制MM01事务创建物料主数据的完整流程,包括如何生成基础BDC代码。最后展示了将录制的脚本改造为可批量处理文件数据的实用程序,核心改动包括定义数据结构、读取文

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 322

async异步函数

async异步函数

weixin_44161385的博客 2573

海康Visionmaster-通讯管理:使用 Modbus TCP 通讯 协议与流程交互

海康Visionmaster-通讯管理:使用 Modbus TCP 通讯 协议与流程交互

视觉人机器视觉的博客 9176

基于YOLOv10的微小目标检测,多头检测器提升小目标检测精度

引入多头检测器助力YOLOv10,暴力提升小目标检测性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 2569

异步函数async

异步函数async

baidu_39009276的博客 1万+

FPGA实现PCIe接口

PCI Express(PCIe)是一种高速串行计算机扩展总线标准,在FPGA中实现PCIe接口可以实现与主机系统的高速数据通信。以下是FPGA实现PCIe接口的关键技术要点。

whm128的博客 1460

【ES6】异步操作和async函数

【ES6】异步操作和async函数一、基本概念二、回调函数三、Promise四、async函数 引言:ES6新增的Generato、Promise、async都与异步编程有关。这里我们讲述async函数和相关的异步操作。 异步编程对于JavaScript语言极为重要。JavaScript 只有一个线程,如果没有异步编程, 得卡死,基本没法用。 ES6诞生前,异步编程的方法大概有下面4种: 回调...

十一月廿七风雨大作 7207

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ES6 async函数

co模块约定,yield命令后面只能是Thunk函数或Promise对象,而async函数的await命令后面,可以是Promise对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即resolved的Promise对象)调用该函数,遇到await就去任务队列中执行异步操作,等到异步操作完成,在执行函数体后面的语句。async取代Generator函数的星号*,await取代Generator函数的yield。//Promise对象方法。//async函数写法。

2501_90329733的博客 575

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ES6---async函数

ES6---async函数一、基本用法promise异步编程 + async函数async函数多种使用形式(1)函数声明(2)函数表达式(3)对象的方法(4)箭头函数二、async函数返回值三、Promise 对象的状态变化四、await 命令五、错误处理六、async函数使用注意点七、async 函数的实现原理八、按顺序完成异步操作 一、基本用法 async函数处理异步编程,类似状态机。 封装多个promise进行异步编程。 async函数就是将 Generator 函数的星号(*)替换成asyn.

赵佳敏的博客 2734

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ES6深入—async 函数 与 Symbol 类型

对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。如果有,就返回这个 Symbol 值,否则就新建并返回一个以该字符串为名称的 Symbol 值。ES5 时,声明对象属性通常使用的是字符串,ES6 中提供了 Symbol,使用 Symbol 可以作为对象的属性名。函数的 message 可以省略,表示对当前 Symbol 值的描述,用于区分 Symbol 变量。示例,新建一个名为 test1.js 的文件,在其中写入以下代码。statements: 函数体语句。

2401_89694040的博客 859

ES6 async 函数

async 函数 标题 内容 async的引入 this指向, 构造函数, arguments对象, Generator async的含义 async函数是什么? async的特点 内置执行器, 更好的语义, 更广的适用性, 返回值是Promise async的引入 ES2017标准引入了async函数,使得异步操作变得更加方便。也可以说是Generator的语法糖。 (了解)AsyncFunction构造函数 AsyncFunction构造函数用来创建新的异步函数对

JackDan9 1192

ES6——21、async 函数

ES2017 标准引入了 async 函数,使得异步操作变得更加方便。async 函数是什么?一句话,它就是 Generator 函数的语法糖。前文有一个 Generator 函数,依次读取两个文件。上面代码的函数gen可以写成async函数,就是下面这样。一比较就会发现,async函数就是将 Generator 函数的星号()替换成async,将yield替换成await,仅此而已。

chtazycdf的博客 1132

ES6 中的 async 函数是什么?

async函数是 ES6 中的一项重要特性,它极大地简化了异步编程的过程。通过使用async函数和await关键字,你可以编写更清晰、更易读的异步代码。相比于传统的回调函数和 Promise,提供了更好的异步处理方式。同时,顶层await的引入使得异步编程变得更加灵活和方便。无论你是新手还是经验丰富的开发者,掌握async函数都是非常重要的。

Front end development engineer 851

ES6 Promise、Symbol、async函数

当new Promise()执行之后,promise对象的状态会被初始化为`pending`,这个状态是初始化状态。`new Promise()`这行代码,括号里的内容是同步执行的。括号里定义一个function,function有两个参数:resolve和reject。如下:

超逸の学习技术博客 931

ES8 中的 async/await — 异步函数

ES8 中的 async/await — 异步函数

weixin_43822185的博客 1078

es6【async 函数】

async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。下面是一个例子。上面代码是一个获取股票报价的函数,函数前面的async关键字,表明该函数内部有异步操作。调用该函数时,会立即返回一个Promise对象。下面是另一个例子,指定多少毫秒后输出一个值。上面代码指定 50 毫秒以后,输出。由于async函数返回的是 Promise 对象,可以作为await命令的参数。

热情、奔放、快乐编程! 1208

ES6 ~ ES11 学习笔记

es6 ~ es11 学习笔记

DanielSYC的博客 2403

ES6 async函数 基本用法详解

简介 async函数也就一种异步解决方案,是在ES2017引入的,为了使得异步更加方便,它可以说是Generator函数的语法糖。 下面有一个例子,分别用async和Generator写,大家可以看下区别, //generator const gen = function* () { const result = yield readFile("哈哈",...

麻瓜哇哇哇的博客 978

ES6常问面试题(Promise,async和await 等)

Promise 是es6引入的异步编程的新解决方案 ,语法上Promises是一个构造函数,用来封装异步操作并可以获取其成功或者失败的结果,实例化一个Promise对象,里面有一个参数,参数是函数类型值,有两个形参,一个是resolve,一个是reject,然后执行一个异步 操作,会得到一个数据,然后调用resolve方法,然后promise的状态就会变成一个成功,然后调用promise对象的.then方法,里面有两个函数,一个是成功的时候调用,一个是失败的时候调用。它类似于对象,也是键值对的集合。

idiot_MAN的博客 3246
上一篇: Generator 学习笔记
下一篇: ES6第十九章Generator函数异步应用
跟着大佬学习
博客等级 码龄8年 2粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值