在 ES10 中如何使用 Generator 和 Async Generator

ES6 引入了 Generator 技术,允许开发者编写基于迭代协议的函数,可以控制函数的执行流程。在 ES10 中,Generator 技术进一步完善,增加了 Async Generator,可以用于更灵活的异步编程。

Generator

Generator 是一个迭代协议的函数,可以暂停和恢复函数的执行。Generator 函数通过使用 yield 关键字,允许开发者在不中断函数执行的情况下,从函数中返回一个值。

Generator 函数示例:

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

使用 for…of 循环遍历 Generator 函数,获取每一个 yield 的值:

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

如果需要在 Generator 函数中接受参数,可以在调用 Generator 实例时传递参数:

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

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

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

除了 next() 方法,Generator 还有其他方法,如 return()throw(),可以用于控制函数的执行流程。

Async Generator

Async Generator 是一种异步可迭代协议,是 Generator 的扩展,可以返回异步值或 Promise,并且可以使用 await 表达式来处理异步调用。

Async Generator 函数示例:

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

使用 for await…of 循环遍历 Async Generator 函数,获取每一个异步 yield 的值:

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

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

示例代码

一个基于 async/await 和 Async Generator 技术的异步数据获取示例:

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

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

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

上述代码中,fetchData() 函数是一个 Async Generator,通过 fetch()await 关键字从指定的 API 获取数据并解析 JSON。在 processData() 函数中,使用 for await…of 循环遍历 fetchData() 获取的数据。

总结

在 ES10 中,通过 Generator 和 Async Generator 技术,开发者可以编写更灵活、更高效的异步代码。虽然这两种技术可能会增加代码复杂度,但是在需要处理异步数据流时仍然是非常有用的。

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