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