引言
ES9(即 ECMAScript 2018)是从语言角度上对异步编程提供了更好的支持,其中最有价值的特性之一便是异步迭代器。在之前的 ES6 中,我们通过 for-of
循环来遍历迭代器并遍历迭代器的值,但是由于它是同步的,它不能很好地使用异步值。现在,有了这个特性,我们可以在异步环境下使用 for-await-of
循环来遍历异步迭代器。
异步迭代器
异步迭代器是一个返回 Promise 的迭代器对象,它使得可以基于 Promise 的概念来处理异步的值。相较于同步迭代器(即一个迭代器对象,其 next()
方法返回下一个值),异步迭代器需要对于每个值都要执行一些异步操作。
我们可以通过定义 Symbol.asyncIterator
方法来创建一个异步迭代器,该方法返回一个拥有 next()
方法的对象,这个 next()
方法返回一个 Promise,以异步地返回迭代器的下一个值。
下面是一个例子,它使用异步迭代器来遍历一个返回异步数据的迭代器:
-- -------------------- ---- ------- ----- --------- ---------------- - ----- --- --------------- -- ------------- -- ----------- ------- ----- --- --------------- -- ------------- -- ----------- ------- ----- --- --------------- -- ------------- -- ----------- ------- - ------ -- -- - --- ----- ------ --- -- ----------------- - ----------------- - -----
在此示例中,asyncGenerator
函数是一个异步迭代器,该函数每隔一秒钟返回一个 Promise。for-await-of
循环中,我们使用 await
等待异步值,异步地遍历迭代器并打印它们。
异步操作符
为了方便使用异步迭代器,ES9 引入了三个新的操作符:await
, yield
, 和 yield*
。这些操作符类似于它们在同步上下文中的行为,但是它们的行为是异步的,当遇到异步值时,它们会等待 Promises 时完成。
一些示例代码:
-- -------------------- ---- ------- ----- --------- ---------------- - --- - - -- ----- -- - -- - ----- --- --------------- -- ------------------- ------- ----- ---- - - ------ -- -- - --- ----- ------ --- -- ----------------- - ----------------- - -----
在这个例子中,我们使用 await
操作符等待每一次迭代器的值,并在迭代器中等待一秒钟。最终,for-await-of
循环输出 0 到 4 的数值。
结论
ES9 中提供的异步迭代器与新的异步操作符为我们的异步编程提供了极大的便利性,同时也带来了一些新的技术挑战。使用异步迭代器可以更方便地处理异步数据,避免回调地狱和 Promise 的链式调用,同时增加了代码的可读性和可维护性。从这个意义上说,异步迭代器已成为了现代 JavaScript 应用程序的标准。
参考
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67385582317fbffedf0fb3c2