每天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绘制饼图之基本配置——万能模板案例
740 0
matplotlib绘制饼图之基本配置——万能模板案例
|
10月前
|
弹性计算 运维 安全
云上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 时经常遇到调用失败的问题
514 1
|
前端开发 JavaScript
JavaScript开发中ES6+新特性:简述async/await的用法。
JavaScript开发中ES6+新特性:简述async/await的用法。
239 0
|
C语言 C++ Linux
查看gcc/g++默认include路径
转自:http://gcc.gnu.org/ml/gcc-help/2007-09/msg00205.html   `gcc -print-prog-name=cc1plus` -v `g++ -print-prog-name=cc1plus` -v   例如,CentOS 6.
2130 0
|
SQL 监控 关系型数据库
MySQL 如何阅读死锁日志
一 前言工欲善其事必先利其器,前面分析了很多死锁案例,并没有详细的介绍如何通过死锁日志来诊断死锁的成因。本文将介绍如何读懂死锁日志,尽可能的获取信息来辅助我们解决死锁问题。二 日志分析2.1 场景为了更好的学习死锁日志,我们需要提前了解死锁场景 MySQL 5.6 事务隔离级别为RRCREATE T...
459 2
|
存储 Java
Java中方法、字段名的最大长度是多少?
由于Class文件中方法、字段等都需要引用 CONSTANT_Utf8_info 型常量来描述名称,所以 CONSTANT_Utf8_info 型常量的最大长度也就是 Java 中方法、字段名的最大长度。
553 0
MyBatis这样用,同事直呼哇塞,堪称最佳实践
MyBatis是一款非常流行的ORM框架,相信很多小伙伴都在使用。我们经常会把它和MyBatis-Plus或者MBG一起使用,用多了之后对于其一些常规操作就不太熟悉了。最近总结了下MyBatis的实用用法和技巧,希望对大家有所帮助!