在 ECMAScript 2018 中,for await...of 得到了增强。这个特性并不是新的,它在 ES2018 之前就已经存在了。for await...of 允许我们在异步迭代器上进行循环操作,它的目的是处理异步可迭代对象,比如流、数据集以及异步生成器等等。在这篇文章中,我们会介绍 for await...of 的增强,让你更深入地理解它的工作方式和如何使用它。
for await...of 的基本用法
在讨论 for await...of 的增强之前,我们需要先了解一下它的基本用法。下面是一个使用 for await...of 循环异步可迭代对象的基本代码示例:
----- -------- ----------- - ----- ------------- - ------------------- --- ----- ------ ------- -- -------------- - --------------------- - -
在上面的示例中,我们定义了一个异步函数 asyncFunc,获取了一个异步可迭代对象 asyncIterable。当我们使用 for await...of 循环异步可迭代对象时,在每次循环中,都会执行一次 await 操作,直到异步迭代器返回一个值或结束。当异步迭代器返回一个值时,我们的代码就会执行 console.log(element),打印出值。
for await...of 的增强
在 ES2018 中,for await...of 得到了增强,它可以处理异步可迭代对象中的异常,还支持限制异步操作的并发数量。
for await...of 处理异步可迭代对象中的异常
在之前版本的 for await...of 中,如果循环体内部抛出了异常,那么整个程序都会终止。但在 ES2018 中,如果循环体内部需要处理异常,那么我们可以使用 try/catch 来捕获并处理异常。下面是一个包含异常处理的代码示例:
----- -------- ----------- - ----- ------------- - ------------------- --- ----- ------ ------- -- -------------- - --- - --------------------- - ----- ------- - ------------------- ------ ----------- - - -
在上面的示例中,我们使用 try/catch 来处理循环体内部可能抛出的异常。如果异常被抛出,我们会把它打印出来,但程序不会终止。
for await...of 限制并发数量
在异步编程中,大量的并发操作可能会导致一些问题。为了避免这种情况,我们可以使用 for await...of 的另一个增强特性:限制异步操作的并发数量。下面是一个限制并发数量的代码示例:
----- -------- ----------- - ----- ------------- - ------------------- ----- -------------- - -- ----- -------- - --- --- ----- ------ ------- -- -------------- - ----- ------- - ---------------------------- ----------------------- -- ---------------- -- --------------- - ----- ------------------------------- ----------------- - - ----- ---------------------- -
在上面的示例中,我们定义了一个最大并发数量 maxConcurrency 和一个 promises 数组来存储所有异步操作的结果。每当我们从异步可迭代对象中获取一个值时,我们就会启动一个异步操作,并将它的结果添加到 promises 数组中。如果当前 promises 数组的长度等于 maxConcurrency,我们将调用 Promise.race 来等待任何一个异步操作结束。一旦有一个异步操作的状态变为 resolved 或 rejected,它就会被从 promises 数组中删除。
一旦我们完成了所有的异步操作,我们可以使用 Promise.all 来等待它们全部完成。
总结
for await...of 是一个用于循环异步可迭代对象的特性。在 ES2018 中,它得到了增强,增加了处理异常和限制并发数量的功能。在编写异步代码时,使用 for await...of 可以让我们更好地控制异步操作的执行顺序,并且更加灵活。
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64ca37835ad90b6d041a171f