ES9 的 for await...of 迭代器深入分析

阅读时长 4 分钟读完

ES9为JavaScript的异步操作提供了一个新的迭代器:for await...of。该迭代器可以用来遍历异步操作的异步迭代器,例如异步生成器函数和流。在接下来的文章中,我们将深入分析这个新迭代器并提供详细的学习和指导意义。

异步迭代器

在我们深入for await...of迭代器之前,让我们回顾一下什么是异步迭代器。异步迭代器是一个对象,它定义了一个异步生成器函数返回的序列的迭代方式。

异步迭代器类似于常规迭代器,但它们返回一个Promise,这个Promise将在异步操作完成后解决,然后迭代器可以继续进行下一步迭代。异步迭代器对象必须实现Symbol.asyncIterator方法。

以下是一个简单的异步迭代器例子:

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

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

这里有一个异步生成器函数asyncGen,它通过await语句来模拟异步操作。该函数生成一个数字1,2和3并暂停2、4和7秒钟。asyncGen函数返回一个异步迭代器对象,它使用yield操作生成上述数字序列。

for await...of迭代器

for await...of是一种新的循环语句,它可以遍历异步迭代器对象。该循环将等待异步Promise解决并提供迭代器的下一个值。以下是使用for await...of迭代器遍历上面定义的异步迭代器的示例代码:

这里我们用for await...of循环遍历asyncGen异步迭代器中生成的数字。因为asyncGen是一个异步生成器函数,所以我们需要将循环语句封装在一个async函数中以便我们使用await语句。

输出结果:

需要注意的是,for await...of循环可以处理并行异步I/O。这意味着在遍历序列的同时,可以在序列执行期间处理多个异步I/O操作。以下是一个并发使用for await...of迭代器的示例代码:

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

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

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

这个例子定义了一个名为readFiles的异步迭代器函数,它遍历指定目录下的文件和文件夹。如果存在子目录,该函数将递归地遍历子目录。

for await...of循环中,我们处理依次读取的文件。每个文件的处理都是并行的,因为它们被封装在一个异步迭代器中。

总结

for await...of迭代器是ES9中很有用的功能,它帮助我们处理异步I/O操作。在使用for await...of迭代器时,我们需要注意以下几点:

  • 使用异步生成器函数定义异步迭代器。
  • for await...of循环中使用await等待异步Promise完成。
  • 基于异步Promise,for await...of循环能够执行并行的异步I/O操作。

以上是ES9的for await...of迭代器的深入分析。希望这篇文章能够帮助您理解这个新的JavaScript功能,并带您更进一步的开发经验。

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

纠错
反馈