ECMAScript 2017 中新增的异步迭代器及 for-await-of 循环语句

异步迭代器

在 ECMAScript 2015 中,迭代器被引入到了 JavaScript 中。迭代器是一个对象,它具有一个 next() 方法,每次调用 next() 方法都会返回一个对象,该对象包含迭代器的下一个值及一个 boolean 类型的 done 属性,表示是否还有更多的值可供迭代。迭代器可以被用在 for-of 循环中,用来遍历数组、字符串和其他可迭代对象。

随着 JavaScript 中异步编程的兴起,异步迭代器被引入到了 ECMAScript 2017 中。异步迭代器是一个对象,它具有一个 Symbol.asyncIterator 属性,该属性是异步迭代器在类似 for-await-of、for-await-in 这样的循环语句中被识别的标记。异步迭代器的 next() 方法返回一个 Promise 对象,该 Promise 对象有一个 value 属性,代表下一个迭代值,以及一个 boolean 类型的 done 属性,表示是否还有更多的值可供迭代。

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

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

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

-------

在该示例代码中,asyncGenerator() 是一个异步生成器函数,它返回一个异步可迭代对象。main() 函数通过 for-await-of 循环遍历异步生成器生成的异步迭代器,打印出每一个异步值。

for-await-of 循环

for-await-of 循环是 ECMAScript 2017 中新增的一个语句,它用于异步迭代器的遍历。与 for-of 循环不同的是,for-await-of 循环遍历的是异步迭代器,每次迭代都需要等待 Promise 对象的 resolve(),并获取到异步值。如果在遍历过程中出现了错误,for-await-of 循环会调用 Promise 对象的 reject() 方法。

下面是使用 for-await-of 循环遍历异步迭代器的示例代码:

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

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

-------

在该示例代码中,asyncGenerator() 是一个异步生成器函数,它返回一个异步可迭代对象。for-await-of 循环通过异步迭代器遍历异步生成器生成的异步迭代器,打印出每一个异步值。在异步生成器的第二个 yield 语句之前抛出一个错误,for-await-of 循环通过 catch 语句捕获错误并打印出错误信息。

结论

ECMAScript 2017 中的异步迭代器及 for-await-of 循环语句使得 JavaScript 开发者可以更方便地实现异步迭代操作,从而更好地支持异步编程。通过异步迭代器,我们能够遍历异步生成器生成的异步可迭代对象,从而更好地处理异步任务。通过 for-await-of 循环语句,我们能够更方便地遍历异步迭代器,并更好地处理异步迭代过程中出现的错误。

最后提醒大家,使用异步迭代器时需要注意 await 语句及 Promise 对象的使用,以避免代码中出现死锁。

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