JavaScript ES9:异步迭代器
JavaScript ES9 异步迭代器是 ES6 迭代器和 ES7 异步迭代器的结合,它可以帮助我们在执行异步任务的过程中进行迭代。
异步迭代器可以帮助我们逐一地处理由异步操作模块返回的数据,并且可以在数据块的传输期间停止或恢复这个过程。这种迭代器的处理方式,使得它非常适合用于请求 REST API, 数据库,文件流等异步数据块。
为什么需要异步迭代器?
在以前的 JavaScript 版本中,我们往往要使用回调函数来执行异步操作。一般情况下,我们使用回调函数来获取执行异步操作之后的结果。例如,当我们从文件系统读取大型文件时,我们需要读取数据流,而不能一次性将所有数据读取到内存中。
异步迭代器目的是消除回调函数地狱(callback hell),这是由于在回调函数嵌套需要执行异步操作的时候,所造成的代码混乱问题。
例如,下面的代码展示了在 ES5 中从文件系统读取文件数据的方法:
-- -------------------- ---- ------- --- -- - -------------- -------- -------------- --------- - ----------------- ------- ------------- ----- - -- ----- - -------------- - ---- - -------------- ------------- - --- - -------------------- ------------- -------- - -- ----- - ------------------- - ---- - --------------------- - ---
异步操作很难保证在代码中的执行顺序,而现在,ES9 的异步迭代器可以帮助我们更好地解决这个问题。
如何使用异步迭代器?
ES9 中的迭代器和异步迭代器在语法上的主要区别是返回值。迭代器语法中的迭代器 next() 方法返回下一个值,而异步迭代器语法返回一个 Promise 对象,该对象在被解决前挂起执行并等待下一个值。
异步迭代器返回的 promise 可以被 await 关键字使用,并在 async 函数中进行处理。
让我们看一个从文件系统异步读取文件数据的例子:
-- -------------------- ---- ------- ----- -- - -------------- -------- -------------- - --- ------- - -- ----------- ----- ------------- - - ----- ---------- - ---------- - ------ - ---------- ------ ------- ---- ------- --------- ----- ----- ------ --- ----------------- ------- -- - ---------------------- ------- --------- ----------------- ----- ----- -- - ------- - ------------ - ---- - --------------- ----- ----- -------- - --- --- - ---- - ------ ---------------------- ------- - - -- ------------- ------ - ----------------------- -- -- ------------- - - ----- ------ - --------------------- --- ----------- ----- -- ------- - ------------------------------ -
在上述示例代码中,我们使用了 ES9 异步可迭代对象来异步读取文件中的数据块。然后在 for await 循环中使用 ES9 的异步迭代器来处理每个数据块,直到文件中的所有数据块被处理完为止。
在每个循环迭代中,我们使用 await 关键字来阻塞异步函数的执行直到当前值返回,并将返回的数据块打印到控制台上。
总结
ES9 中的异步迭代器使得在执行异步操作的过程中进行迭代更加的容易。在处理 REST API 和数据库查询之类的异步数据块时,它可以来逐块处理数据,使得我们能够更好地抽象控制流。如果你想更好地理解 JavaScript 异步迭代器的概念和用法,可以从上述示例代码开始进行学习,并通过实际实践来进一步深入掌握。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f23175f6b2d6eab3bea6b6