ES8(也称为 ECMAScript 2017)正式发布于 2017 年 6 月。其中最引人注目的新特性之一是异步迭代。本篇文章将深入介绍异步迭代的定义、优点和使用方法,以及如何在代码中使用它。
什么是异步迭代?
异步迭代允许我们在异步和同步模式下使用 for...of 循环。之前的版本中,for...of 只适用于同步迭代器,如数组和字符串。异步迭代器是一种支持异步操作的新型迭代器。它是一个返回 Promise 的对象。每个 Promise 都会返回一个 value 和 done 值。done 值指示是否已完成整个数据集的迭代。
异步迭代器需要实现 Symbol.asyncIterator 方法,该方法应返回一个具有 next() 方法的对象。next() 方法返回一个 Promise,该 Promise 包含一个对象,其中包含当前迭代的值和 done 值。如果要使用异步迭代器,我们可以使用新的 for await...of 循环,以与已同步的 for...of 循环相似的方式处理数据集中的每个值。例如:
async function foo() { let asyncIterable = createAsyncIterable(['a', 'b']); let asyncIterator = asyncIterable[Symbol.asyncIterator](); console.log(await asyncIterator.next()); // { value: 'a', done: false } console.log(await asyncIterator.next()); // { value: 'b', done: false } console.log(await asyncIterator.next()); // { value: undefined, done: true } }
在这里,createAsyncIterable 是一个生成异步迭代器的函数。我们通过使用 Symbol.asyncIterator 方法来获取异步迭代器,并使用 await 运算符异步读取每个元素。
异步迭代的优点
异步迭代的主要优点是它使我们能够更轻松地处理异步数据集。这在 Web 应用程序的开发中非常有用,因为 Web 应用程序通常需要等待许多异步操作,例如从数据库中检索数据或从 Web 服务中获取数据。在这些情况下,异步循环能够更好地处理数据集。
异步迭代器还支持生成器。当使用生成器时,返回的值不必立即计算。它可以等待一段时间再计算,这是非常有用的,特别是在等待具有高延迟的结果时。
如何在代码中使用异步迭代
使用异步迭代器的最常见方法是在使用 for await...of 循环时。下面是一个简单的示例,演示如何使用该循环:
-- -------------------- ---- ------- ----- -------- --------------- - ----- ---- - ---------------------------------------------- ------------------------------------------------- --- ----- ---- --- -- ----- - ----- -------- - ----- ----------- ----- ---- - ----- ---------------- ------------------ - - ----------------
在这个例子中,我们使用了 for await...of 循环来依次处理 urls 数组中的所有 URL。我们通过使用 fetch API 来下载每个 URL,然后使用 response.json() 方法将结果转换为 JSON 对象。每个对象都传递给控制台。
结论
在这篇文章中,我们深入介绍了异步迭代的概念、优点和使用方法。作为一个异步迭代的新特性,它的优点在于它可以更轻松地处理异步数据集,并且与 for await...of 循环非常兼容。你可以在你的代码中使用它来处理异步操作,以及在处理高延迟数据时使用它。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6715e0c9ad1e889fe2194783