ES10 的 for-await-of 循环详解及使用场景介绍

ES10 中引入了 for-await-of 循环,能够迭代异步生成器函数(Async Generator Function)产生的值。在这篇文章中,我们将讨论 for-await-of 循环的详细使用和适用场景,并提供示例代码和指导。

什么是异步生成器函数

异步生成器函数是一个 Async Function,用于生产一个异步迭代器。它通过 async 和 yield* 关键词来定义。以下是一个简单的例子:

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

这里的 generate() 函数将生成一个异步迭代器,它将按顺序生成 1、2、3。在这里,我们使用 yield* 语句将一个同步迭代器转换为异步迭代器。

for-await-of 的基本用法

for-await-of 循环可以通过迭代异步生成器函数产生的值,如下所示:

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

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

----------

在这里,for-await-of 循环将按顺序迭代 generate() 函数中的值:1、2和3。这里使用了 async 函数和 await 关键字来等待异步操作的完成。

使用场景

for-await-of 循环的实际用途是迭代权威的异步数据源。以下是针对不同类型的异步数据源使用 for-await-of 循环的几个示例:

1. 迭代异步生成器函数

我们可以将异步生成器函数的返回值传递给 for-await-of 循环,以异步方式迭代产生的值。举个例子,假设我们从某个 API 调用中获得了一个异步数据源,并希望将其异步迭代:

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

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

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

在这个示例中,我们通过异步调用 fetch() 获取了一个 JSON 数据源, 将其转换为 item 数组, 然后使用 yield* 语句将其作为 Async Generator Function 的输出。使用 for-await-of 循环来异步迭代并打印每个 item。

2. 迭代异步迭代器

我们也可以使用 for-await-of 循环来迭代任何类似于数组、映射或集合的异步迭代器。举个例子,假设我们从某个数据库查询中获得了一个异步数据源,并希望将其异步迭代:

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

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

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

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

在这个示例中,我们使用 openDatabase() 函数异步打开了一个数据库连接并从中获得了用户数据。将结果传递给 for-await-of 循环以异步迭代每个用户,并打印每个结果。

3. 迭代异步可迭代对象

最后,我们可以使用 for-await-of 循环来迭代异步可迭代对象,如文件读取器。

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

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

在这个示例中,我们使用 fileStream 构造器来异步打开一个文件,使用 readline.createInterface() 将其转换为可迭代的对象,然后使用 for-await-of 循环来读取每行数据并将其打印到控制台中。

结论

for-await-of 循环使我们能够异步地迭代异步数据源,使其更具可读性和可维护性。它是异步编程的强大工具和 ES10 语言功能。在你的下个异步项目中,强烈建议将 for-await-of 循环作为异步数据源的首选迭代方法。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6717228fad1e889fe2201921