在 JavaScript 中,迭代器是一个非常重要的概念,它允许开发者遍历数据集合中的每个元素。在 ES6 中引入了可迭代对象以及迭代器,使我们的工作变得更加容易。而 ES9 中增加了异步迭代器的概念,进一步提升了 JavaScript 异步编程的效率与可读性。
异步迭代器的基本概念
异步迭代器遍历的数据集合是一个异步的集合,如 Promise 和 Generators 函数。我们先来看看异步 Promise 的实现:
-- -------------------- ---- ------- ----- ----- - ------ -- - ------ --- ----------------- -- - ------------------- ----- -- - ----- ------ - ------- -------- ------- ----- --------------- - - ------------------------ - --- --- - - ------ - ----- ----- ---------- - -- ---- - -------------- - ----- ----------- ------ - ------ -------------- ----- ----- - - ---- - ------ - ------ ---------- ----- ---- - - - - - - ------- ---------- - --- ----- ------ ----- -- ---------------- - ------------------ - ----
我们可以通过上面的代码来理解异步迭代器的基本概念。我们首先定义了一个名为 sleep 的函数来模拟异步操作,然后我们利用可迭代对象 Symbol.asyncIterator 属性来实现异步迭代器的特性,最后通过 for-await-of 循环来遍历异步数据集合。
Symbol.asyncIterator 的实现
我们来看看 Symbol.asyncIterator 是如何实现的。它和 Symbol.iterator 一样,都是有特定的规则的。在实现 Symbol.asyncIterator 时,我们需要遵循一些规则:
- 可以是任意类型的
- 必须返回一个迭代器对象
- 迭代器对象必须包含 next 方法
- next 方法返回的对象必须是 Promise
-- -------------------- ---- ------- -- ----- ----- --------------- - - ------------------------ - --- --- - - ------ - ----- ----- ---------- - -- ---- --------- ----- ------ - ------ ----- ----- ---- - - - - -
我们可以简单的定义一个异步迭代器,它返回了一个包含 next 方法的对象,next 方法返回一个 Promise 对象,其中包含 value 和 done 两个属性,value 表示返回的值,done 表示是否已经取完了异步数据集合中的所有元素。
更好的应用场景
异步迭代器在如下情形下特别有用:
- 异步获取元素,例如通过异步 API 获取元素,并直到异步请求完成后才将元素返回给迭代器。
- 对从异步数据源中返回的元素进行转换后返回。
下面我们来看一个实例代码,实现异步迭代器实现通过异步 API 获取元素:
-- -------------------- ---- ------- ----- ------------- - ------------------- - ----------- - ------ - ----- ------------------------- - --- ----- - --------- ----- ------ - ----- ------ - ----- --------------------- ----- -- -- ----------------------- - ------ - ------ ------------- ----- - ----------------------- - - - ------- ---------- - ----- ---------- - --- ------------ ----- ------------- - --- ------------------------- --- ----- ------ ------ -- -------------- - ------------------- - ----
我们可以通过如上所示的代码来获取异步 API 获取元素,当然你还可以对元素数据做处理,从而实现更多的功能。
总结
异步迭代器是 ES9 中的新特性,它通过 Symbol.asyncIterator 属性来实现接口,允许开发者遍历异步的集合数据并且能够进行条件筛选和转换,为我们开发异步 JavaScript 应用程序提供了一个更加简单,直观的方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6455ede6968c7c53b0944444