每天3分钟,重学ES6-ES12(十四)async/await

简介: 每天3分钟,重学ES6-ES12(十四)async/await

19c2e7a9bfbb7f5e8c7d744db995e29.png

每天3分钟,重学ES6-ES12文章汇总

前言

今天开始和大家一起系统的学习ES6+,每天3分钟,用一把斗地主的时间,重学ES6+,前面我们介绍了迭代器和生成器,今天继续介绍async 和 await

异步函数 async function

  • async关键字用于声明一个异步函数:
  • async是asynchronous单词的缩写,异步、非同步;
  • sync是synchronous单词的缩写,同步、同时;

异步函数的执行流程

  • 异步函数的内部代码执行过程和普通的函数是一致的,默认情况下也是会被同步执行。
  • 异步函数有返回值时,和普通函数会有区别:
  • 情况一:异步函数也可以有返回值,但是异步函数的返回值会被包裹到Promise.resolve中;
  • 情况二:如果我们的异步函数的返回值是Promise,Promise.resolve的状态会由Promise决定;
  • 情况三:如果我们的异步函数的返回值是一个对象并且实现了thenable,那么会由对象的then方法来决定;
  • 如果我们在async中抛出了异常,那么程序它并不会像普通函数一样报错,而是会作为Promise的reject来传递;

异步函数和普通函数的区别-返回值

异步函数的返回值一定是一个Promise

async function foo() {
  console.log("中间代码~")
  // 1.返回一个值
  // promise then function exec:  1
  return 1
  // 2.返回thenable
  // promise then function exec:  hahahah
  return {
     then: function(resolve, reject) {
       resolve("hahahah")
     }
  }
  // 3.返回Promise
  // promise then function exec: hehehehe
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("hehehehe")
    }, 2000)
  })
}
// 异步函数的返回值一定是一个Promise
const promise = foo()
promise.then(res => {
  console.log("promise then function exec:", res)
})

异步函数和普通函数的区别-异常

异步函数中的异常会被作为promise的reject的值

async function foo() {
  console.log("foo function start~")
  console.log("中间代码~")
  // 异步函数中的异常, 会被作为异步函数返回的Promise的reject值的
  throw new Error("error message")
  console.log("foo function end~")
}
// 异步函数的返回值一定是一个Promise
foo().catch(err => {
  console.log("err:", err)
})

await关键字

  • async函数另外一个特殊之处就是可以在它内部使用await关键字,而普通函数中是不可以的。
  • await关键字有什么特点呢?
  • 通常使用await是后面会跟上一个表达式,这个表达式会返回一个Promise;
  • 那么await会等到Promise的状态变成fulfilled状态,之后继续执行异步函数;
  • 如果await后面是一个普通的值,那么会直接返回这个值;
  • 如果await后面是一个thenable的对象,那么会根据对象的then方法调用来决定后续的值;
  • 如果await后面的表达式,返回的Promise是reject的状态,那么会将这个reject结果直接作为函数的Promise的 reject值;

代码演示

// 1.await 跟上表达式
function requestData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(222)
      // reject(1111)
    }, 2000);
  })
}
async function foo() {
   const res1 = await requestData()
   console.log("后面的代码1", res1)
   console.log("后面的代码2")
   const res2 = await requestData()
   console.log("res2后面的代码", res2)
}
// 依次打印
// 后面的代码1 222
// 后面的代码2
// res2后面的代码 222
// 2.跟上其他的值
async function foo() {
   const res1 = await 123
   // 返回值 res1: 123
   const res1 = await {
        then: function(resolve, reject) {
            resolve("abc")
        }
   }
   // 返回值 res1: abc
   const res1 = await new Promise((resolve) => {
       resolve("why")
   })
   // 返回值 res1: why
   console.log("res1:", res1)
}
// 3.reject值
async function foo() {
  const res1 = await requestData()
  console.log("res1:", res1)
}
foo().catch(err => {
  console.log("err:", err)
})


相关文章
|
消息中间件 Java 数据安全/隐私保护
Spring Boot 中的 AmqpTemplate 是什么,原理,如何使用
Spring Boot 中的 AmqpTemplate 是什么,原理,如何使用
|
数据库 Python
matplotlib绘制饼图之基本配置——万能模板案例
matplotlib绘制饼图之基本配置——万能模板案例
653 0
matplotlib绘制饼图之基本配置——万能模板案例
|
8月前
|
弹性计算 运维 安全
云上DevOps自动化的最佳实践
本文介绍了云上DevOps自动化最佳实践,重点探讨了企业在上云过程中面临的成本管理、运维效率和弹性等问题。通过阿里云的产品和服务,企业可以实现自动化的资源管理、成本优化和高效运维。文章详细阐述了如何利用标签进行成本分析、选择合适的付费类型和实例规格、以及通过弹性伸缩降低成本。此外,还介绍了新功能发布,如统一的实例运维通道界面、AI辅助的运维工具等,帮助企业提升云上业务的管理和运营效率。
|
存储 缓存 安全
阿里云服务器2核4G、4核8G、8核16G配置活动价格及实例规格选择参考(2024更新)
阿里云服务器2核4G、4核8G、8核16G配置有三十几种实例规格可选,2024年,经济型e、通用算力型u1、计算型c7和计算型c8y实例2核4G、4核8G、8核16G配置的云服务器有优惠,其中,通用算力型u1实例2核4G,5M固定带宽,80G ESSD Entry盘企业用户购买只要199元/1年,另外轻量应用服务器2核4G配置也有优惠,目前价格只要165元/1年。下面是2024年截至目前阿里云服务器2核4G、4核8G、8核16G配置最新活动价格及选择建议参考。
阿里云服务器2核4G、4核8G、8核16G配置活动价格及实例规格选择参考(2024更新)
|
开发工具 开发者
使用阿里云的 OpenAPI SDK 时经常遇到调用失败的问题
使用阿里云的 OpenAPI SDK 时经常遇到调用失败的问题
475 1
|
设计模式 Java 测试技术
单元测试运行原理探究
单元测试是软件开发过程中的重要一环,好的单测可以帮助我们更早的发现问题,为系统的稳定运行提供保障。单测还是很好的说明文档,我们往往看单测用例就能够了解到作者对类的设计意图。代码重构时也离不开单测,丰富的单测用例会使我们重构代码时信心满满。虽然单测如此重要,但是一直来都不是很清楚其运行原理,也不知道为什么要做这样或那样的配置,这样终究是不行的,于是准备花时间探究下单测原理,并在此记录。
378600 30
单元测试运行原理探究
|
JavaScript 前端开发 数据安全/隐私保护
npm 上传发布自定义组件以及使用详细流程(Vue包含)(上)
npm 上传发布自定义组件以及使用详细流程(Vue包含)
480 0
如何正确控制springboot中bean的加载顺序总结
springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题。在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功能。 在一般业务场景,可能你不大关心一个bean是如何被注册进spring容器的。只需要把需要注册进容器的bean声明为@Component即可,spring会自动扫描到这个Bean完成初始化并加载到spring上下文容器。
|
Java 关系型数据库 MySQL
Spring Boot 2.7发行,2.5弃用,节奏太快 卷不动了
Spring Boot 2.7发行,2.5弃用,节奏太快 卷不动了
|
存储 Java
Java中方法、字段名的最大长度是多少?
由于Class文件中方法、字段等都需要引用 CONSTANT_Utf8_info 型常量来描述名称,所以 CONSTANT_Utf8_info 型常量的最大长度也就是 Java 中方法、字段名的最大长度。
490 0