如何使用 ES12 中的 `for-await-of` 循环处理异步迭代器

ES12 在语法层面上提供了一个新的迭代器协议 AsyncIterable,可以处理异步生成器中的 yield 操作符,并为异步迭代器提供 for-await-of 循环

异步迭代器初步

异步迭代器是遵循异步迭代器协议的对象,异步迭代器必须提供一个异步的 next() 方法,这个方法会返回一个 Promise,Promise 的值是一个带有 done 和 value 的对象。

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

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

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

使用 for-await-of 进行异步迭代

for-await-of 的语法与 for-of 循环相似,不同在于它可以用于异步迭代器上,它会自动调用异步迭代器的 next() 方法,并根据 Promise 返回的结果决定循环是否结束。

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

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

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

for-await-of 的错误和捕获

在遍历过程中,如果当异步操作失败或出错,for-await-of 循环会抛出错误,可以使用 try-catch 进行捕获,也可以在异步迭代器中通过 throw 抛出异常,for-await-of 循环会自动捕获并抛出。

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

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

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

结论

通过学习异步迭代器和 for-await-of 循环,我们可以更方便的处理异步操作,将异步输出转为同步的方式。同时,学习错误捕获也非常重要,可以帮助我们及时调试和解决问题。

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