ES8 中添加的 Async Iterator 功能详解

在 ES8 中,JavaScript 语言引入了异步迭代器(Async Iterator),是对同步迭代器(Iterator)的一次补充。异步迭代器允许我们在异步生成器函数(Async Generator Function)的基础上迭代生成的异步值。异步迭代器的引入解决了异步编程领域中一些复杂的问题,本篇文章将为大家详细解释异步迭代器的功能以及如何使用它。

异步迭代器的定义

异步迭代器是一个实现了 Symbol.asyncIterator 方法的对象,该方法返回一个异步生成器函数,异步生成器函数是一个 Generator 函数的变体,它使用了 async/await 语法,用来生成异步值。

除此之外,异步迭代器还需要实现一个 next 方法并返回一个 Promise 对象。Promise 对象解析后返回的是一个带有 valuedone 属性的对象,value 表示异步生成器生成的值,done 表示异步生成器是否完成生成。

异步迭代器的使用

使用异步迭代器的作用主要是在以下两种情况下:

  1. 在数组等数据结构上异步迭代每一个元素。

  2. 在可读流上逐个异步读取数据。

下面是一个使用异步迭代器遍历数组的示例代码:

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

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

使用异步迭代器遍历可读流的示例代码如下:

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

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

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

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

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

同步迭代器与异步迭代器的区别

异步迭代器在使用上与同步迭代器的使用方式十分类似,在异步方法前面添加 async 关键字即可,如:

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

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

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

同步迭代器返回一个 Iterator 对象,每次迭代使用的是 next() 方法,而异步迭代器返回一个 AsyncIterator 对象,每次迭代使用的是 next() 方法的扩展版 await next(),这里的 await 用来等待 Promise 对象的解析结果。

结论

异步迭代器将异步编程拓展到了迭代器上,它不仅在可读流等依赖异步方法的场景下有了很好的应用,同时还能提升代码的可读性和易维护性。我们相信,异步迭代器会在未来的JavaScript开发中扮演更重要的角色。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671257dcad1e889fe2048d2d