用 ES12 的 for await...of 处理异步操作!

随着 JavaScript 愈发成熟,异步编程已经成为现代 JS 开发的必备技能。为了解决异步编程时的回调地狱、Promise 链和竞争条件等问题,ES6 引入了 async/await 语法,使得对于异步操作的处理变得更加优雅和简单。

不过在某些情况下,async/await 仍有一些局限,比如处理多个异步操作的集合时。在这种情况下,ES12 为我们提供了 for await...of 常见语法,它为异步操作提供了透明且流畅的处理方式。

for await...of 常见语法简介

for await...of 常见语法是 ES12 新增的异步迭代器语法,它允许我们在 for 循环中使用异步操作的集合。与普通的迭代器不同的是,异步迭代器可以暂停并等待下一个值返回。

下面是一段 for await...of 常见语法的示例代码,该代码演示了如何使用异步迭代器迭代异步生成器产生的值:

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

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

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

该示例代码定义了一个异步生成器 asyncGenerator,它使用 async function* 语法定义。函数的主体内使用 yield 语句返回 1、2、3 这三个值。

consumeAsyncGenerator 函数定义了一个异步迭代器 asyncIterable,并使用 for await...of 语法迭代 asyncGenerator 产生的异步值。每产生一个异步值,for 循环会迭代一次,并输出该值。

可以看到,异步迭代器的工作方式类似于普通的迭代器,但它是异步的,并且可以等待异步操作完成后继续迭代下一个值。

使用 for await...of 处理异步操作

除了用异步生成器产生异步值,for await...of 还可以用于处理异步操作的集合。下面是一个例子:

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

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

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

该示例代码定义了一个带超时的 fetchWithTimeout 函数,它允许我们使用 Promise.race() 模式来限制请求在超时时间内完成。fetchWithTimeout 函数返回一个 Promise,可以在 then() 和 catch() 中处理成功和失败的情况。

fetchAllWithTimeout 函数使用 map() 方法将多个 fetchWithTimeout 函数强制转换为一个 Promise 数组。然后将这个数组用于 for await...of 循环,以便一次处理每个 URL 的响应数据。

由于 for await...of 常见语法返回的是异步值,我们可以通过简单地迭代来逐个收集异步响应。在本例中,我们将每个响应数据添加到 responses 数组中,并在最后以数组的形式返回结果。

总结

for await...of 常见语法是 ES12 中非常实用的异步操作处理方式。它可以帮助我们避免回调地狱和 Promise 链式调用的问题,同时让我们可以使用迭代器的方式处理异步操作的集合,提供透明且流畅的处理方式。

尽管 for await...of 常见语法仍处于实验阶段,但它已经被广泛支持并使用,并且在考虑处理异步集合时是很好的选择。

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


猜你喜欢

  • Kubernetes 中的 Pod 最佳实践

    本文将详细介绍 Kubernetes 中 Pod 的最佳实践,旨在帮助前端开发人员更好地了解并发挥 Kubernetes 优势,提升应用的部署稳定性以及可维护性。首先我们将了解什么是 Kubernet...

    1 年前
  • 如何架构和部署并解决 SPA 页面卡顿和白屏的问题

    单页应用(Single Page Application,简称 SPA)在现代 Web 应用程序中常常被使用。与传统的多页应用相比,SPA 的最大的优势就是通过 Ajax 技术和路由跳转实现动态加载网...

    1 年前
  • 使用 Tailwind 进行表单设计的技巧

    在前端开发中,表单是非常常见的一个组件,而表单设计的好坏和用户体验密切相关。Tailwind 是一个流行的 CSS 框架,可以帮助我们进行快速的界面设计。本文将介绍如何使用 Tailwind 进行表单...

    1 年前
  • Docker Compose 的使用指南

    前言 Docker Compose 是 Docker 公司为了解决 Docker 镜像的部署问题而推出的一款工具。使用 Docker Compose 可以轻松地管理和运行多个 Docker 容器。

    1 年前
  • 如何在 LESS 中使用变量定义 border-radius

    在前端开发中,经常会用到 border-radius 属性来实现圆角效果。一般来说,我们会直接写具体的数值,如 border-radius: 5px;,但是这样不利于维护和修改。

    1 年前
  • 在 Chai.js 中测试函数返回的 Observable 对象

    前言 在前端开发中,我们常常会使用一些响应式编程框架(例如:RxJS)中的函数返回 Observable 对象,通常情况下,我们需要对这些函数进行单元测试。而在进行单元测试时,我们使用的是 Chai....

    1 年前
  • AngularJS 中对注入服务的懒加载实现原理

    AngularJS 是一种流行的前端框架,它被广泛应用于开发单页面应用程序(SPA)。在 AngularJS 中,通常需要使用服务来管理数据和业务逻辑。服务通常以注入形式引入到组件中使用。

    1 年前
  • ES10 中 Symbol 的新特性,Symbol.prototype.description

    ES10 中 Symbol 的新特性:Symbol.prototype.description 在 JavaScript 中,Symbol 是一种新的基本数据类型,它可以用来生成唯一的标识符。

    1 年前
  • Fastify 中的 HTTP 状态码处理与最佳实践

    在前端开发中,HTTP 状态码的处理是至关重要的一环。Fastify 是一款快速且低开销的 Web 框架,其提供了一些有用的功能来处理 HTTP 状态码。本文将深入探讨 Fastify 中的 HTTP...

    1 年前
  • ES9 中如何使用 flatMap 方法处理多级嵌套数组

    在前端开发中,常常会遇到多级嵌套的数组,我们需要将这些嵌套数组扁平化处理后,再进行数据操作。ES9 中,新增了 flatMap 方法,可以一行代码就解决这个问题。本文将详细介绍 ES9 中如何使用 f...

    1 年前
  • 如何使用 Express.js 和 Stripe 实现支付

    Stripe 是一款非常流行的支付解决方案,而 Express.js 则是一款灵活而且易于使用的 Node.js Web 框架。在本文中,我们将学习如何结合使用这两个工具,实现一个简单而又实用的支付系...

    1 年前
  • 如何在 Koa 应用中使用 Swagger 进行 API 文档管理

    在大型前端应用中,API 文档管理对于项目的正常运作至关重要,而 Swagger 是一个优秀且流行的 API 文档管理工具。在 Koa 应用中,使用 Swagger 可以更方便地管理和维护 API 文...

    1 年前
  • Enzyme 及 React Native 中的 Jest 单元测试入门

    在现代前端开发中,单元测试已经成为了一个必不可少的环节。单元测试可以有效地保证代码质量和功能的正确性,可以避免代码的重复性和错误的发生。在 React 和 React Native 的开发中,有两个非...

    1 年前
  • 如何使用 Azure 函数实现 Serverless 架构

    近年来,Serverless 成为了前端开发者们热议的话题。Serverless 是一种架构设计模式,它不再需要前端开发者自己维护服务器和后端的代码,所有的这些资源都可以通过云服务提供商的平台来托管和...

    1 年前
  • Next.js 项目如何集成 Typescript?

    介绍 在前端项目中,Typescript 越来越受欢迎。Next.js 是一个常用的 React 服务器端渲染框架,通过集成 Typescript 可以提高项目的可维护性和代码质量。

    1 年前
  • CSS Grid 的孪生兄弟 —— Flexbox 布局详解

    前言 在前端开发中,布局一直是一个核心问题。在过去,我们通常使用Float和Positioning方法来实现页面布局。但是这些方法有很多弊端,比如布局困难,脆弱,不方便等等。

    1 年前
  • MongoDB 集合操作中的锁机制与应对策略

    在 MongoDB 中,对集合进行操作时会出现锁机制,其主要目的是保证集合操作的一致性和正确性,同时影响了一个 MongoDB 实例的性能。 MongoDB锁机制 MongoDB 采用了两种锁进行管理...

    1 年前
  • Sequelize ORM 如何在查询中使用自定义函数

    Sequelize 是一种基于 Node.js 的 ORM 框架,它支持多种数据库,比如 MySQL、PostgreSQL、SQLite 等。在使用 Sequelize 进行数据库操作时,有时候我们需...

    1 年前
  • Material Design 中使用 CoordinatorLayout 实现联动效果

    如果你是一个前端开发人员,你可能已经听说过 Material Design 。Material Design 是 Google 推出的一种设计语言,它尝试为应用程序提供统一的外观和感觉。

    1 年前
  • 解析 ES8 中新增的 Object.entries() 方法

    在 ES8 中,新增了一种遍历对象的方法——Object.entries()。该方法的出现让开发者在处理对象时变得更加方便快捷。本文将详细介绍 Object.entries() 方法的使用方法以及其深...

    1 年前

相关推荐

    暂无文章