ES6、ES7 和 ES8 中的 async/await 非常详细的介绍

介绍

在 JavaScript 中,异步编程是非常重要的一部分。在 ES6 之前,我们使用回调函数、Promise 等方式来处理异步编程。而在 ES6 中,JavaScript 引入了 async/await 关键字,使得异步编程更加易用和可读。

async/await 是基于 Promise 的封装,只是语法更加友好,让我们可以更加方便地进行异步编程。从 ES2017(即 ES8)开始,async/await 又进行了优化和增强,使得其更加强大。

async 和 await 的用法

async

async 关键字用于定义一个异步函数,异步函数返回一个 Promise 对象。例如:

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

await

await 关键字用于暂停异步函数的执行,等待一个 Promise 对象它的状态变为 resolved,然后再继续执行异步函数。例如:

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

上面代码中,fetch 函数返回一个 Promise 对象,我们通过 await 暂停了 getData() 函数的执行,等待 Promise 对象返回数据后,才会继续执行。

需要注意的是,await 只能在异步函数中使用,其返回值为 Promise 对象 resolve 后的值。

async/await 的优点

1. 代码可读性更高

相比于回调函数和 Promise,async/await 代码的可读性更高。语法结构更加清晰,代码更加易读,连续异步操作如同同步一样,更符合想法和直观。

2. 异常和错误处理更加方便

使用 async/await 可以更加方便地进行异常和错误的处理。如果 await 返回的 Promise 对象 reject,那么将会抛出一个错误,我们可以使用 try/catch 来进行捕获。

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

3. 支持顺序执行

使用 async/await 可以实现顺序执行异步函数,代码结构更加清晰。下面是一个示例:

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

上面代码中,我们使用 await 实现了顺序执行 fetch('/api/data1') 和 fetch('/api/data2')。

async/await 的缺点

1. 可读性过度

在代码中, 添加了太多的asyncawait会使代码阅读更复杂且难懂, 这些代码看起来很难看, 因为异步操作的执行过程被过度强调。

2. 无法取消 Promise

在 await 等待一个请求的响应期间, 我们将无法取消这个 Promise 的请求。

3. 难以提前知道执行过程

我们可能需要阻塞程序的执行, 直到它处理完所有的异步请求。但是, 在使用 async/await 的情况下, 很难知道已经执行了哪些异步任务,并且单调等待完成状态可能会导致一些性能问题。

ES7 和 ES8 中的增强

1. 并行请求

在 ES7 中,可以使用 Promise.all() 方法,使多个异步请求可以并行处理。例如:

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

上面代码中,我们使用 Promise.all() 方法,将 fetch('/api/data1') 和 fetch('/api/data2') 并行发起,可以加快响应速度。

2. Promise finally

在 ES8 中,Promise 对象增加了一个 finally 方法,该方法无论 Promise 对象状态如何,都会执行传入的回调函数。例如:

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

总结

通过本文的介绍,我们了解了 ES6、ES7 和 ES8 中的 async/await 关键字,以及其在异步编程中的优势和可读性,还介绍了其缺点和 ES7、ES8 中对其的优化和增强。

在实际的项目开发中,我们应根据具体情况选择使用回调函数、Promise 或 async/await 进行异步编程,以保证代码简洁、可读性高、易于维护。

参考资料

MDN 文档

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


猜你喜欢

  • 在 React 中使用 Jest 和 Enzyme

    React 是一个广泛使用的前端框架,被许多企业和开发者所采用。为了保证 React 代码的质量,我们需要使用单元测试来测试我们构建的组件。Jest 和 Enzyme 是测试 React 组件的两个最...

    1 年前
  • TypeScript 中如何处理对象类型

    TypeScript 是一个基于 JavaScript 的语言,可以帮助我们在开发时进行类型检查,避免出现很多错误。使用 TypeScript 进行开发的过程中,对象类型的处理显得尤为重要。

    1 年前
  • Babel 学习笔记:如何配置源码解析

    在前端开发中,我们需要在各种浏览器上运行我们的 JavaScript 代码。然而,不同的浏览器对 JavaScript 的支持程度是不同的,这就导致了一些兼容性问题。

    1 年前
  • Redis 如何应对网络分区的问题?

    简介 Redis 是一种开源的内存数据结构存储系统,它可以支持多种数据结构,如字符串(String)、哈希(Hash)、链表(List)、集合(Set)、有序集合(Sorted Set)等。

    1 年前
  • ESLint 规则中的 no-console 详解

    前言 在前端开发中,我们经常使用 console 打印信息,在调试中起到了非常重要的作用。但是在生产环境中,这些调试信息会将不必要的信息暴露给用户,而且也会降低运行速度。

    1 年前
  • Koa 项目中如何使用 Webpack 打包前端代码

    介绍 在现代的前端开发中,我们经常会使用 Webpack 对前端代码进行打包。而在 Koa 项目中,我们也可以利用 Webpack 对前端代码进行打包,来更好地管理和优化我们的代码。

    1 年前
  • MongoDB 如何控制查询返回结果的数量?

    MongoDB 是一款非关系型数据库,作为一款高性能的 NoSQL 数据库,MongoDB 提供了多种灵活的查询方式。而在进行查询时,针对返回结果的数量控制也是非常重要的。

    1 年前
  • 解决用 Headless CMS 导致的 GraphQL 查询和分页问题

    作为一名前端工程师,您可能已经熟悉使用 CMS(Content Management System)来协助构建站点和应用程序。但是,为了更好地进行内容管理和主题设计,越来越多的网站和应用程序选择 He...

    1 年前
  • React + Enzyme:如何测试组件

    React 是一个流行的 JavaScript 库,用于构建复杂的用户界面。它的组件化设计使得开发人员可以轻松地构建可重用的组件。然而,在构建大型应用时,确保组件的正确性变得至关重要。

    1 年前
  • 使用 Hapi 框架处理静态资源

    Hapi 是一款基于 Node.js 平台的开源 Web 应用框架,它提供了一个强大的、可扩展的插件系统,同时对于路由、请求处理、验证等功能都有着良好的支持。本文将介绍如何使用 Hapi 框架来处理静...

    1 年前
  • 不用长轮询,这个 JS 插件可以让你用 SSE 实现推送

    不用长轮询,这个 JS 插件可以让你用 SSE 实现推送 在前端开发中,实时推送是一个非常常见的需求。在 Web 应用中,需要实时更新数据、交互和状态等。以前实现这种实时推送的方式是使用长轮询,但这种...

    1 年前
  • 什么是实时 Web(Real-Time Web):WebSocket、Socket.IO 和 Comet

    随着互联网的发展,越来越多的网站需要实时展示数据和交互更新。这时候就需要使用“实时 Web(Real-Time Web)”技术。 实时 Web 是指通过特定的通信协议,能够在客户端和服务器之间实现实时...

    1 年前
  • Deno 中的事件监听实例解析

    Deno 是一个用于 JavaScript 和 TypeScript 运行时的现代化、安全的环境。与 Node.js 不同,Deno 原生支持 TypeScript,具备更强的安全性,更好的开发体验。

    1 年前
  • Fastify 与 Kubernetes 的快速部署教程

    Fastify 与 Kubernetes 的快速部署教程 前言 随着微服务体系的逐渐成熟,Kubernetes 成为了目前最流行的容器编排工具之一。而 Fastify 由于其出色的性能,也成为了前端领...

    1 年前
  • Mongoose 自带数据校验教程及常用校验类型

    Mongoose 自带数据校验教程及常用校验类型 Mongoose 是一个针对 MongoDB 数据库的 Node.js 框架,它提供了非常完整的操作数据库的 API,同时也支持数据校验,让开发人员可...

    1 年前
  • 在 PWA 应用中集成支付宝和微信支付

    前言 随着移动互联网的普及和无线技术的不断发展,越来越多的企业开始将自己的业务逐渐转向移动端,其中 PWA 应用也在这个过程中得到了广泛的应用。PWA 应用是 Progressive Web Apps...

    1 年前
  • 使用 Next.js 和 Tailwind CSS 创建网页布局

    使用 Next.js 和 Tailwind CSS 创建网页布局 在现代 web 开发中,快速创建网页布局并保持可扩展性是很重要的。Next.js 和 Tailwind CSS 是两个流行的工具,它们...

    1 年前
  • 响应式设计如何应对文本折行问题

    在响应式设计中,文本折行是一项常见问题。虽然在不同设备上文本长度不同,但合适的文本折行可以使界面更美观、易读,提高用户体验。本文将探讨响应式设计中的文本折行以及如何解决相关问题。

    1 年前
  • ES10 中的 Symbol 对象详解

    Symbol 是 ES6 中新增的一种数据类型,其主要作用是用来表示一个独一无二的标识符,常用于对象属性的名称、迭代器方法等场景。ES10 中增加了一些新的 API,本文将详细介绍 Symbol 的用...

    1 年前
  • 如何在 LESS 中使用 interpolation?

    在编写 LESS 样式时,使用 interpolation 可以方便地在样式中插入动态变量,从而实现更为灵活的样式控制。下面就来介绍一下如何在 LESS 中使用 interpolation。

    1 年前

相关推荐

    暂无文章