ES9 异步迭代器:结合 Symbol.asyncIterator 更佳实用

阅读时长 5 分钟读完

在 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

纠错
反馈