在 ES10 中,JavaScript 引入了 for await...of
迭代器,这使得在异步编程中使用迭代器变得更加容易。 for await...of
是 for...of
语法的异步版本,可以用于迭代任何异步可迭代对象。本文将详细介绍如何使用 for await...of
,让您可以轻松地使用异步迭代器。
如何使用 for await...of 迭代器
异步迭代器是具有 Symbol.asyncIterator
方法的对象,该方法返回一个异步迭代器对象。异步迭代器对象具有一个 next
方法,用于返回一个 Promise 对象,该对象包含 value
和 done
两个属性。
例如,下面的代码展示了如何定义一个简单的异步迭代器:
const asyncIterable = { async *[Symbol.asyncIterator]() { yield Promise.resolve(1); yield Promise.resolve(2); yield Promise.resolve(3); } };
接下来,使用 for await...of
迭代器遍历异步可迭代对象:
(async function() { for await (const value of asyncIterable) { console.log(value); // 1,2,3 } })();
上述代码中,使用 async function
定义一个异步函数,调用 for await...of
迭代器遍历了 asyncIterable
对象的每个值。在这个例子中,asyncIterable
具有三个 Promise 值,Promise 值的解析结果是 1
、2
和 3
。使用 for await...of
迭代器,可以依次输出这三个值。
下面是一个更复杂的例子,展示了在 Promise 并行执行时如何使用 for await...of
迭代器:
-- -------------------- ---- ------- ----- -------- - - -------------------- -------------------- ------------------- -- ----- -------- --------- - --- ----- ------ ----- -- --------- - ------------------- -- -------- - - ----------展开代码
在这个例子中,定义了一个包含三个 Promise 的数组,并定义了一个异步函数 process
,使用 for await...of
迭代器依次输出每个 Promise 的解析值。
深入学习 for await...of 迭代器
for...of
循环可以用于同步可迭代对象,而 for await...of
迭代器则是用于异步可迭代对象。异步迭代器是实现 Symbol.asyncIterator
方法的对象,该方法返回一个异步迭代器对象。
使用异步迭代器时,需要在 async
函数中使用 for await...of
迭代器。在使用 for await...of
循环时,需要等待 Promise 的解析结果,并在 Promise 解析成功时返回相应的结果。
使用 for await...of
迭代器遍历异步迭代器时,只有在上一个 Promise 解析成功后,才会执行下一个 Promise。
在处理异步可迭代对象时,需要注意以下几点:
- 异步可迭代对象必须实现
Symbol.asyncIterator
方法 Symbol.asyncIterator
方法必须返回一个异步迭代器对象,该对象必须具有next
方法next
方法返回的对象必须是一个 Promise 对象,并且包含value
和done
两个属性。
总结
for await...of
迭代器提供了一种简单且优美的方式,用于迭代异步可迭代对象。异步可迭代对象是异步迭代器实现 Symbol.asyncIterator
方法的对象。您可以在异步函数中使用 for await...of
迭代器,依次解析每个 Promise 解析结果的值。在处理异步可迭代对象时,需要注意异步迭代器必须返回包含 value
和 done
两个属性的 Promise 对象。
希望本文能够让您更加深入地学习 for await...of
迭代器,并为您的异步编程带来便利。现在您已经可以使用 for await...of
迭代器,处理各种异步可迭代对象了。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6459c157968c7c53b0bdec6a