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
迭代器遍历上面定义的异步迭代器的示例代码:
(async () => { for await (const num of asyncGen()) { console.log(num) } })()
这里我们用for await...of
循环遍历asyncGen
异步迭代器中生成的数字。因为asyncGen
是一个异步生成器函数,所以我们需要将循环语句封装在一个async函数中以便我们使用await
语句。
输出结果:
1 2 3
需要注意的是,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