ECMAScript 2020 (ES11):如何使用 异步 Generator 开始异步 generator

阅读时长 4 分钟读完

异步 Generator 是 ECMAScript 2020 (ES11) 中新增的一个特性,它可以在异步函数的基础上更方便地实现异步迭代器。它可以让我们在处理异步数据时更加灵活,本文就来详细介绍一下异步 Generator 的使用方法。

异步 Generator 的基本概念

异步 generator 和普通 generator 有一个很大的不同,就是异步 generator 可以使用异步模式的 yield。 在普通 generator 中,我们使用 yield 来暂停函数执行。运行流程将回到生成器生成的最后一个值。但对于异步资源,例如异步API,我们需要暂停生成器来等待一个异步或者 promise 的结果,以便我们可以在获取结果后去做一些自己的业务逻辑。这时候我们就可以使用异步 generator。

异步 Generator 定义的方法要比普通的 Generator 多了个 async 关键字。它的形式如下:

我们在定义异步 generator 的时候可以在 function 关键字前面加上 async,yield 后面使用 await 关键字等待一个异步或者 promise 结果,这样可以保证异步 generator 的运行顺序,也使程序代码更加简洁、易读。

如何使用异步 Generator

在异步 generator 中,我们可以使用 for-await-of 循环来遍历异步生成器返回的异步序列。与普通的 for-of 不同,for-await-of 可以处理异步逻辑。

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

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

在上面的例子中,我们使用生成器生成三个异步数据,然后使用 for-await-of 循环输出它们。 由于 for-await-of 是异步的,所以我们得到的结果也是异步的。

在异步 generator 中,我们也可以使用 throw 和 return 关键字,它们的用法与普通 generator 基本相同。

示例代码

最后我们来看一个使用异步 generator 处理数据的示例代码:

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

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

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

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

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

在上面的例子中,我们定义了一个异步 generator handleDataAsync。在 handleDataAsync 中,我们使用 await 等待 fetchDataFromAPI 返回 todos 数据,再使用 yield 返回数据。 接着,我们让当前程序 sleep 5秒钟,然后返回另外一个名为 users 的数据。在 for await of 反复遍历生成器时,会等待返回的数据结果,然后将其输出到控制台上。

结论

在本文中,我们详细介绍了如何使用异步 Generator 开始异步 generator,通过示例代码我们学习了如何使用 for-await-of 循环遍历异步生成器,以及如何使用异步 Generator 处理数据等。在实际开发中,我们可以将异步 Generator 这个特性应用到异步逻辑处理中,从而让程序更加灵活、高效,代码也会更加简洁,易于维护。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67539e648bd460d3ada65c68

纠错
反馈