Yield 和 Generators 远不止 ES2015 和 ES2020

阅读时长 6 分钟读完

引言

在前端开发中,我们经常需要处理一些异步操作,例如网络请求、定时器等等。在 ES2015 中,引入了 Promiseasync/await 等语法来帮助我们更方便地处理异步操作。但是,还有一种强大的语法 yieldGenerators,它们可以帮助我们更灵活地处理异步操作,而且不仅仅在 ES2015 和 ES2020 中有用,它们的应用范围远不止于此。

Yield 和 Generators

Yield

yield 关键字用于定义一个暂停函数的返回值,它只能在 Generators 函数中使用。当 Generators 函数执行到 yield 语句时,会暂停执行并返回 yield 后面的值,等待下一次调用继续执行。

下面是一个示例:

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

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

在上面的示例中,Generators 函数 foo 中定义了三个 yield 语句,分别返回了 12undefined。在调用 generator.next() 方法时,Generators 函数会从上一次暂停的地方继续执行,直到遇到下一个 yield 语句或者执行完整个函数。

Generators

Generators 函数是一种特殊的函数,它可以暂停执行并返回多个值,而且可以在执行过程中随时停止和恢复执行。在 ES2015 中,Generators 函数一般用于异步编程,可以用来处理网络请求、定时器等异步操作。

下面是一个示例:

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

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

在上面的示例中,Generators 函数 fetchUser 中定义了两个 yield 语句,分别返回了两个网络请求的结果。在调用 generator.next() 方法时,会返回一个 Promise 对象,可以通过 Promisethen 方法来处理网络请求的结果,并继续执行下一个 yield 语句。

Yield 和 Generators 的更多应用

除了在 ES2015 中用于异步编程外,yieldGenerators 还有很多其他的应用。

1. 生成器函数的迭代

Generators 函数可以通过 for...of 循环来迭代生成器函数的返回值。

下面是一个示例:

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

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

在上面的示例中,Generators 函数 foo 中定义了三个 yield 语句,分别返回了 123。在 for...of 循环中,可以依次迭代生成器函数的返回值,输出 123

2. 生成器函数的组合

Generators 函数可以通过 yield* 关键字来组合多个生成器函数。

下面是一个示例:

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

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

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

在上面的示例中,Generators 函数 foo 中定义了两个 yield 语句,分别返回了 12Generators 函数 bar 中定义了三个 yield 语句,分别返回了 3foo 的返回值和 4。在 for...of 循环中,可以依次迭代生成器函数的返回值,输出 3124

3. 生成器函数的状态机

Generators 函数可以通过 yield 关键字来实现状态机。

下面是一个示例:

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

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

在上面的示例中,Generators 函数 light 中定义了一个状态机,可以依次返回红灯、黄灯和绿灯的状态。在 setInterval 定时器中,可以每隔一秒钟输出一次状态。

总结

yieldGenerators 是一种强大的语法,可以帮助我们更灵活地处理异步操作,而且不仅仅在 ES2015 和 ES2020 中有用,它们的应用范围远不止于此。我们可以通过 yieldGenerators 来实现生成器函数的迭代、组合和状态机等功能,从而更好地处理复杂的业务逻辑。

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

纠错
反馈