ES10 中的 for-await-of 语法详解及异步遍历实践

阅读时长 6 分钟读完

在 ES2018 中,JavaScript 引入了两个非常重要的特性,即 asyncawait。这两个关键字让我们可以更方便地处理异步代码,避免了回调地狱的问题。但是,在处理多个异步操作,尤其是在遍历异步操作时,我们还需要更多的工具来简化代码。

在 ES10 中,我们看到了一些新的语法特性,其中最重要的就是 for-await-of。这个新语法简化了异步遍历的过程,让我们能够更容易地遍历异步操作的结果。在本文中,我们将介绍 for-await-of 的语法,以及它在实际开发中的应用。

for-await-of 的语法

在 ES10 中,我们可以使用 for-await-of 来遍历一个异步操作的结果。它的语法如下:

这里,item 是每个异步操作的结果,asyncIterable 是一个异步可迭代对象,它可以返回一个包含异步操作的结果的迭代器。在循环过程中,我们可以使用 await 关键字来暂停执行,等待每个异步操作完成。

你可以将 for-await-ofasyncawait 结合使用,来处理一个包含异步操作的数组、集合或其他数据结构。下面是一个例子:

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

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

这个例子中,我们定义了一个名为 asyncIterable 的异步生成器,它在每次迭代时等待 1 秒钟,然后返回下一个数字。我们接着使用 for-await-of 循环异步生成器的结果,用 await 暂停执行,等待每个异步操作的结果。在循环过程中,我们输出每个数字,最终输出结果将是 0、1 和 2。

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

在实际开发中,我们经常需要处理多个异步操作,如异步读取文件、异步发送网络请求等。使用 for-await-of 可以简化这样的操作,让我们避免使用回调函数或 .then() 方法。下面是一些使用 for-await-of 处理异步操作的例子。

遍历异步生成器的结果

我们可以使用 for-await-of 遍历异步生成器的结果,从而完成异步操作的遍历。下面是一个传统的延时输出的例子:

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

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

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

在这个例子中,我们定义了一个 asyncGenerator 异步生成器,它每次等待一秒钟才返回一个数字,返回的数字逐步增加。我们使用 for-await-of 循环异步生成器的结果,从而实现延时输出的效果。当我们调用 delayedOutput(5) 时,会输出 1 到 5,每个数字延时一秒钟输出一次。

处理异步集合的结果

我们还可以将 for-await-of 用于异步集合的遍历,如异步读取文件和异步发送请求等。下面是一个异步读取文件的例子:

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

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

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

在此例中,我们使用了 fs.promises.readFile() 方法来异步读取文件,并返回文件内容。我们使用 for-await-of 循环文件路径数组,逐个读取每个文件。每个文件读取完成后,我们输出它的内容。

并发处理异步操作

除了使用 for-await-of 循环异步操作,我们还可以使用 Promise.all()Promise.race() 方法来并行执行多个异步操作,并等待它们全部完成或其中任意一个完成。

例如,我们可以使用 Promise.all() 方法来并行执行多个异步操作,如下所示:

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

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

这里,我们并行执行多个 fetch() 异步请求,然后等待它们全部完成,将结果保存在 responses 数组中。接着,我们使用 map() 方法将每个响应对象转换为响应文本,最后将文本内容保存在 contents 数组中。

总结

在 ES10 中,for-await-of 语法让我们更方便地处理异步操作的遍历,避免了回调地狱的问题。我们可以将它与异步生成器、异步集合和 Promise.all() / Promise.race() 方法结合使用,来处理异步代码,让代码更简洁易懂。在实际项目中,我们应该广泛使用 for-await-of 语法,以提高代码的可读性和可维护性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c713dc10032fedd3905fcb

纠错
反馈