async-await

简介: JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解JavaScript的async-await

async异步函数

async 关键字用于声明一个异步函数
// 写法一:
async function foo1() {

}
// 写法二:
const foo2 = async () => {

}
// 写法三:
class Foo {
  async bar() {

  }
}

async异步函数与普通函数的区别

1. 返回值

async 函数一定会返回一个 promise 对象。
如果一个 async 函数的返回值看起来不是 promise,那么它将会被隐式地包装在一个 promise 中。

2. 异常

普通函数:

function foo() {
  console.log("foo function start~")
  console.log("中间代码~")
  throw new Error("error message")
  console.log("foo function end~")
}
foo().catch(err => {
  console.log("error message:", err)
})
console.log("后续还有代码~~~~~")
// 输出抛出异常前面的代码并抛出异常,后面代码不执行

异步函数:

async function foo() {
  console.log("foo function start~")
  console.log("中间代码~")
  // 异步函数中的异常, 会被作为异步函数返回的Promise的reject值的
  throw new Error("error message")
  console.log("foo function end~")
}
foo().catch(err => {
  console.log("error message:", err)
})
console.log("后续还有代码~~~~~")
// 后续代码会被执行,之后打印错误信息

如果我们在async中抛出了异常,那么程序它并不会像普通函数一样报错,而是会作为Promise的reject来传递;

await关键字

await 表达式会暂停整个 async 函数的执行进程并出让其控制权,只有当其等待的基于 promise 的异步操作被 兑现或被 拒绝之后才会恢复进程。promise 的 解决值会被当作该 await 表达式的 返回值
注意:await关键字只在 async 函数内有效。如果你在 async 函数体之外使用它,就会抛出语法错误。

async/await搭配使用:

function requestData1() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1111)
    }, 2000);
  })
}

function requestData2() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      reject(222)
    }, 3000);
  })
}

async function foo1() {
  // 1.await跟上表达式
  const res1 = await requestData1()
  // 2. await跟上其他值
  const res2 = await 123  // "await" 对此表达式的类型没有影响
  console.log("后面的代码1", res1) 
  console.log("后面的代码2", res2)
}
foo1()

// 3.reject值
async function foo2() {
  const res3 = await requestData2()
  console.log("res3:", res3)
}

foo2().catch(err => {
  console.log("err:", err)
})

image.png
当await后面跟着是reject值,则它返回的值会作为整个foo2返回的Promise值,await之后的代码不会执行

总结:

async/await的目的为了简化使用基于 promise 的 API 时所需的语法(promise语法糖)。
async/await的行为就好像搭配使用了生成器和 promise。

目录
相关文章
如何初始化PoolingHttpClientConnectionManager
【8月更文挑战第26天】如何初始化PoolingHttpClientConnectionManager
670 7
|
数据安全/隐私保护
BUUCTF-MISC-08基础破解
BUUCTF-MISC-08基础破解
|
数据安全/隐私保护
wpa_supplicant 的使用
wpa_supplicant 的使用
562 1
|
Linux 开发工具 数据安全/隐私保护
Linux系统 搭建gitlab仓库服务器
Linux系统 搭建gitlab仓库服务器
|
监控 Serverless 应用服务中间件
Serverless 应用引擎操作报错合集之使用自定义镜像部署GPU服务时,报错 "CPU is required but not provided",是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
187 2
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_10 超过经理收入的员工
「SQL面试题库」 No_10 超过经理收入的员工
|
应用服务中间件 nginx Unix
|
Kubernetes Devops Linux
Devops技术栈整理
Docker 构建镜像
436 0
|
JavaScript 前端开发
javascript获取返回当前 URL 的协议
javascript获取返回当前 URL 的协议
282 0
|
存储 测试技术
数据结构之二叉树的实现(二)
之前给大家介绍了有关堆的实现,那么这里小编就给大家带来今天的重头戏——二叉树的实现,以及介绍。
210 0