ES8之async/await模式详解

什么是async/await

async和await是ES8(ECMAScript 2017)引入的新特性,是对Promise更高层次的抽象,能更方便地使用异步函数。

async函数本质上是 Generator 函数的语法糖。async函数返回的是一个Promise对象,await表达式会阻塞代码执行,等待Promise对象的解决,然后获取解决值。

async函数的使用

async函数的定义方式如下:

----- -------- ----- -
  ------ ------
-

------------------- -- --------------------- -- -----

async函数通过async关键字定义,函数体内部通过return返回一个值。

运行方式与普通函数相同,可以直接在函数名后加一对括号调用。

async函数返回的是一个Promise对象,可以使用.then()或者await来获取函数返回的值。

----- -------- ----- -
  ------ ------
-

------------------- -- --------------------- -- -----

----- -------- ----- -
  ----- - - ----- ------
  --------------- -- -----
-

------

上面的代码中,baz()函数内部调用了foo()函数并使用了await关键字阻塞了后面语句的执行,直到foo()函数返回后,才会返回解决值"bar",并赋值给a变量输出到控制台。

await关键字实际上是将一个Promise对象等待并得到解决值,因此我们也可以用await关键字去获取其他返回Promise的API的值。

-------- ----------- -
  ------ --- ----------------- -- -
    ------------- -- -
      -------------- --------
    -- ------
  ---
-

----- -------- ----- -
  ----- - - ----- ------------
  --------------- -- ------ ------
-

------

错误处理

当Promise对象被拒绝(rejected)时,我们希望能够捕获到并进行相应的处理。

  • 使用.catch()

当async函数中会被拒绝的Promise对象被拒绝时,我们可以使用.catch()对其进行捕获并进行处理。

----- -------- ----- -
  ----- ------- - ----------------------------
  ----- ------------------- -- ------------------ -- -----------
-
  • try...catch语句

类似于同步代码的异常处理方式,我们可以使用try...catch语句来捕获异常。

----- -------- ----- -
  --- -
    ----- ------- - ----------------------------
    ----- --------
  - ----- ----- -
    ----------------- -- -----------
  -
-

------

当Promise对象被拒绝时,将会直接跳转到catch语句块内,执行后面的代码。

并发执行多个异步任务

在需要并行执行多个异步任务的情况下,我们可以将多个任务使用.then()连接,或使用Promise.all()来执行并行任务,但这些方法都比较麻烦和容易出错。使用async/await,我们可以更方便、优雅地执行异步任务。

----- -------- ---------- -
  ----- --- -- - ----- ------------------------ -------------
-

上面的代码中,我们使用了数组解构将Promise.all()返回的两个Promise对象解构到变量ab中。

顺序执行多个异步任务

我们也可以将异步任务按顺序执行,需要注意的是await会阻塞后面的表达式,因此在多个await调用是,我们需要按照顺序将它们依次调用。

----- -------- ---------- -
  ----- - - ----- -----------
  ----- - - ----- -----------
-

其他注意事项

1. async函数返回的是一个Promise对象

因此,在async函数内部不需要使用return Promise.resolve(value),直接使用return value即可。

2. async函数内部能够使用大多数的Promise API。

例如Promise.all()Promise.race()等等。

3. await只能出现在async函数体中。

如果我们想要在普通函数内使用await,可以声明一个异步的立即执行函数(IIFE,Immediately-invoked function expression)。

------ -------- ----- -
  ----- - - ----- -----------
-----

总结

async/await模式是我们在异步处理中非常实用的工具。通过使用async/await模式,不仅能够简化异步代码的写法,还能够使代码更加合理清晰,易于维护。需要注意的是,async必须要配合await使用,否则async函数的返回值可能会出现问题。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64716038968c7c53b0f40403


猜你喜欢

  • 如何在 jQuery 应用程序中使用 Material Design 样式?

    随着 Material Design 的流行,许多前端应用程序也开始采用 Material Design 的设计思想和样式。那么,在 jQuery 应用程序中如何使用 Material Design ...

    1 年前
  • ES11 总结:你所需要知道的一切都在这里

    随着 JavaScript 的不断发展,ES11 成为了 JavaScript 的最新版本。它包含了许多新的特性和功能,可以大大提高开发人员的效率和代码的质量。在这篇文章中,我们将深入探讨 ES11 ...

    1 年前
  • 利用 ES7 的 Map 和 WeakMap 构建缓存机制

    在前端开发中,为了提高代码的性能以及减少网络请求次数,我们常常需要使用缓存机制。而在 JavaScript 中,利用 ES7 的 Map 和 WeakMap 绝对是构建缓存机制的最佳选择之一。

    1 年前
  • Koa2 websocket 聊天室实现详解

    随着 Web 技术的不断发展,前端在 Web 开发中的地位越来越重要。而目前 Web 开发中的聊天室功能也成为了一种常见需求。在这篇文章中,我们将详细介绍如何使用 Koa2 和 websocket 实...

    1 年前
  • 使用 Hapi 框架搭建前后端分离应用的总体架构指南

    前言 随着互联网技术的不断发展,越来越多的网站和应用采用前后端分离的架构模式。这种模式既可以提高开发效率,又可以在响应速度和用户体验上有所提升。Hapi 是一款流行的 Node.js 开发框架,它提供...

    1 年前
  • Vue.js 中如何实现头像上传功能?

    在前端开发中,头像上传功能是一个经常需要实现的功能。本文将介绍如何在 Vue.js 中实现头像上传功能。 前置知识 在开始之前,需要掌握 Vue.js 基础知识,以及 HTML 和 CSS 基础知识。

    1 年前
  • 解析 ES6 中的 WeakMap 数据结构的使用方法

    前言 在 ES6 中新增的 WeakMap 数据结构能够有效解决 JavaScript 中常见的内存泄露问题。在前端开发中,一些开发者过于依赖于全局变量和缓存,导致内存泄露问题的出现。

    1 年前
  • Babel 运行时提示 Invalid assignment left-hand side

    Babel 运行时提示 Invalid assignment left-hand side 在进行前端开发过程中,使用 Babel 编译器来转换 ES6+ 语法是一个非常常见的操作。

    1 年前
  • 使用 SSE 和 Flask 实现服务器的实时通知机制

    随着互联网的不断发展,实时通知机制在现代化应用中变得越来越重要。在前端开发中,我们经常需要从后端获取实时数据,并在页面上实时展现这些数据。这时候,使用 SSE(Server-Sent Events)和...

    1 年前
  • Vue SPA 应用中使用 element-ui 框架实现布局

    前言 随着 Vue 技术越来越成熟和普及,越来越多的互联网公司开始使用 Vue 技术进行前端开发。而 Vue 本身只提供了基础的组件和指令,较为简单的开发方式会面对很多问题。

    1 年前
  • 在GraphQL中实现分布式事务

    引言 GraphQL是一种用于API的查询语言和运行时。与传统的RESTful架构不同,GraphQL提供了更为灵活的数据获取方式,是一种强大、高效且易于使用的跨语言查询API服务。

    1 年前
  • 如何设置 Docker 容器的最大内存限制

    如何设置 Docker 容器的最大内存限制 Docker 是一款功能强大的开源容器化平台,它可以提供虚拟环境来运行应用程序。在使用 Docker 时,我们可能会遇到内存资源不足的问题,这时需要对 Do...

    1 年前
  • Angular 中将对象进行动态绑定的方法和实现

    Angular 是一个基于 TypeScript 的前端框架,可以被用来构建单页应用程序(SPA)。在应用程序中,数据一般是通过组件的属性进行传递的,但是在有些情况下,需要对组件的属性进行动态绑定。

    1 年前
  • PM2 遇到高并发访问问题解决方案分享

    前言 在前端开发中,遇到高并发访问问题是非常普遍的。在这种情况下,PM2 是一个可靠的解决方案,可以帮助开发者轻松应对高并发访问问题并提高网站的性能。 在本文中,我将分享我在使用 PM2 处理高并发访...

    1 年前
  • 使用 Contensis 和 Vue.js 构建 Headless CMS

    使用 Contensis 和 Vue.js 构建 Headless CMS Headless CMS 是当前越来越流行的一种思想,它将网站内容管理系统从前端解耦出来,使得开发者可以更加自由地设计和开发...

    1 年前
  • ES8 中 Set 方法的升级及应用

    在 ES8 中, Set 方法得到了升级和扩展,为前端开发带来了更多的便利性和可操作性。在本文中,我们将详细讲述 ES8 中 Set 方法的升级和应用,并提供示例代码。

    1 年前
  • Sass 中如何使用嵌套规则代替类名

    前端开发者经常会遇到多层级的 CSS 类名,在样式表中这些类名会让代码冗余且难以维护。Sass 中的嵌套规则为我们提供了一个简单有效的方式,可以将不同选择器的样式归类到同一处。

    1 年前
  • Mongoose 中的自动增长 ID 的实现方法

    在 Web 开发过程中,自动增长 ID 是一个常见的需求,它可以保证每个实例拥有一个唯一的标识符。在 Mongoose 中,实现自动增长 ID 也是非常简单的。 1. 安装 mongoose-auto...

    1 年前
  • RxJS 之 combineLatest 操作符:数据拼接的利器

    RxJS 之 combineLatest 操作符:数据拼接的利器 在前端开发中,经常会遇到需要在页面中展示多个数据源的情况,这时候就需要将这些不同的数据源拼接起来,再进行展示。

    1 年前
  • Jest mock 函数中的正确用法解析

    在前端开发中,我们经常会使用 Jest 进行单元测试。而在 Jest 中,mock 函数是一个非常重要且常用的概念。使用 mock 函数可以帮助我们轻松地对代码进行测试,并且能够提供更多的控制权来模拟...

    1 年前

相关推荐

    暂无文章