解析 ECMAScript 2018(ES9)的新异步迭代器

阅读时长 5 分钟读完

ECMAScript 2018(ES9)带来了一项新的功能:异步迭代器。这项功能允许使用者异步地遍历任何可迭代的数据结构,例如数组、集合、映射等等,而不会阻塞应用程序的主线程。这是一项强大且方便的功能,对于使用者来说,能够更加高效地操作异步数据,对于开发者来说,则有助于提高代码的可读性和复用性。

异步迭代器的作用

在之前的版本中,迭代器通常是同步进行的,例如:

这个例子中,我们用 for 循环迭代了一个数组,并在控制台中打印了每一个元素。但是在这样的同步迭代器中,如果我们要处理一个包含 1000 个元素的异步数组,那么我们需要等待 1000 次异步请求完成后才能继续执行下一步操作,这会严重影响性能。

异步迭代器的出现打破了这种束缚。它的作用是异步地迭代数据流,并且以适当的速度,使用适当的算法推动数据流的处理。在异步迭代器中,不需要等待每一个异步请求都完成,我们可以在每个请求返回新的数据之后立刻对它进行处理。

创建异步迭代器

使用异步迭代器,需要实现一个返回异步迭代器的方法。例如,我们可以在一个名为 asyncItems 的类中,实现一个异步迭代器方法:

-- -------------------- ---- -------
----- ---------- -
  ------------------ -
    ---------- - ------
  -

  ----- ------------------------- -
    --- ---- - - -- - - ------------------ ---- -
      ----- --------------------------------
    -
  -

  ----- ----------------- -
    ------ -----
  -
-

----- ----- - --- ----------------- --- ----- --- ----- -----

------ -- -- -
  --- ----- ------ - -- ------ -
    ---------------
  -
-----

在这个例子中,我们创建了一个名为 asyncItems 的类,它接受一个数组并保存在 items 属性中。然后,我们实现了 async *[Symbol.asyncIterator]() 方法,它使用 for 循环遍历 items,使用 asyncMethod() 方法处理每个元素。其中,Symbol.asyncIterator 是一个内置的符号常量,用于创建异步迭代器,而 yield 关键字用于返回迭代器的下一个值。

最后,在 asyncMethod() 方法中,我们只是简单地返回了每个元素。在实际情况下,我们可以在这个方法中执行异步操作,并且只有在异步操作完成之后,我们才调用 await 返回结果。

使用异步迭代器

异步迭代器让我们能够异步地处理数据流,并且以适当的速度推动数据的处理。我们可以像使用同步迭代器一样使用异步迭代器,例如:

-- -------------------- ---- -------
----- ------------- - -
  ------------------------ -
    --- - - --
    ------ -
      ----- ------ -
        -- -- - -- -
          ----- --- --------------- -- ------------------- -------
          ------ - ------ ---- ----- ----- --
        -

        ------ - ----- ---- --
      -
    --
  -
--

------ -------- ------ -
  --- ----- ---- --- -- -------------- -
    -----------------
  -
-----

在这个例子中,我们实现了一个带有异步的 [Symbol.asyncIterator]() 方法,并使用 asyncawait 完成了异步处理。然后,在 async function test() 中,我们使用 for await 循环迭代 asyncIterable,并以适当的速度处理数据。

结论

异步迭代器是 ECMAScript 2018(ES9)的一个强大功能。它允许我们异步处理任何可迭代的数据结构,并以适当的速度推动数据的处理。它不仅能够提高性能,还能提高代码的可读性和复用性。如果你正在使用异步数据,建议了解和学习这个功能,相信你一定会发现它对于你的工作会有很大的帮助。

示例代码

-- -------------------- ---- -------
----- ---------- -
  ------------------ -
    ---------- - ------
  -

  ----- ------------------------- -
    --- ---- - - -- - - ------------------ ---- -
      ----- --------------------------------
    -
  -

  ----- ----------------- -
    ------ -----
  -
-

----- ----- - --- ----------------- --- ----- --- ----- -----

------ -- -- -
  --- ----- ------ - -- ------ -
    ---------------
  -
-----

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674a8379a1ce00635491f0b7

纠错
反馈