在 ES9 中,异步遍历器 (Async Iterator) 和生成器 (Generator) 被引入。这两个新特性提供了更为灵活和方便的异步编程方式,可以帮助我们更好地管理和控制异步操作,提高代码可读性和可维护性。
异步遍历器
异步遍历器是一种新型遍历器,它可以在异步场景下迭代数据流。与普通的遍历器不同,异步遍历器支持使用 await
关键字来暂停和等待异步操作返回结果,然后再继续迭代下一个数据。
异步遍历器接口是一个异步函数 next()
,它返回一个 Promise 对象。当 Promise 对象 resolved 时,包含的值对象有两个属性:value 表示本次迭代的结果,done 表示是否迭代结束。
下面是一个示例代码:
-- -------------------- ---- ------- ----- ------------- - - ----- ------------------------- - ----- -- ----- -- ----- -- - -- ------ ---------- - --- ----- ---- --- -- -------------- - ----------------- - -----
上述代码中,我们定义了一个简单的异步可迭代对象 asyncIterable
,使用 for await...of
循环遍历这个对象中的数据。在循环内部,我们使用了 await
关键字来暂停异步操作,直到 Promise 对象 resolved 后再继续执行下一次迭代。
生成器
生成器是另一种优秀的异步编程方式,它允许我们在代码中使用协程 (coroutine) 的方式编写异步操作。通过使用生成器,我们可以将异步操作封装成一个可迭代对象,同时在迭代过程中进行异步操作的调度和管理。
生成器函数用 function*
关键字定义,每次调用 next()
方法时,它会从上一次 yield 的位置继续执行代码,直至下一次执行到 yield 表达式,返回值对象的 value 属性表示这次 yield 表达式的返回值。
下面是一个使用生成器函数实现异步操作的示例代码:
-- -------------------- ---- ------- -------- ------------ - ------ --- ----------------- -- ------------------- -------- - --------- ------------------ - --------------------- ----- ------------ ------------------ - --------- ----- ------------ ------------------ - ---- ---------- ------ ------- - ------ -------- -- - ----- -------- - ------------------- --- ------ - ----- -- - ------ - ----- ---------------- -------------------------- - ----- --------------- -----
上述代码中,我们定义了一个生成器函数 generateMessages
,它包含两个 yield 表达式和一个 return 表达式。我们使用 sleep
函数模拟异步操作,每次 yield 的时候暂停异步操作,等待 Promise 对象 resolved 后再继续执行。
在 main() 函数中,我们使用一个 do-while 循环不断调用生成器函数的 next()
方法,直到返回值的 done 属性为 true 时停止迭代。在每次迭代中,我们使用 await 关键字来暂停代码的执行,并输出 yield 表达式的返回值。
总结
异步遍历器和生成器是 ES9 中引入的两个强大的异步编程特性,它们可以大幅提高我们编写异步程序的效率和可读性,尤其是在处理数据流时极为方便。在使用过程中需要注意异步操作的调度和控制,尽可能让异步操作非阻塞、高效地执行,并避免出现回调地狱的情况。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65b99ea6add4f0e0ff21a7c9