ECMAScript 2017 中的生成器函数详解

阅读时长 5 分钟读完

生成器函数是 ECMAScript 2015 引入的一个新概念,它允许我们在遍历数据时,暂停函数执行,等到需要时再恢复执行。在 ECMAScript 2017 中,生成器函数加入了一些新特性,本篇文章将详解 ECMAScript 2017 中的生成器函数。

从 ECMAScript 2015 的生成器函数开始

在 ECMAScript 2015 中,通过 function* 关键字定义的函数就是一个生成器函数:

在生成器函数中,通过 yield 关键字,可以将函数执行暂停并返回一个值,而函数会保留其上下文环境,直到下一次继续执行时,从上一次暂停的位置继续向下执行,如上例所示。

可以使用 next() 方法执行生成器函数,每次执行 next() 时,函数会执行到下一个 yield 语句为止:

可以看到,每次执行 next() 时,返回的都是一个对象,其中 value 字段表示 yield 返回的值,done 表示函数是否执行完毕。

ECMAScript 2017 中的生成器函数新特性

1. yield* 语句

在 ECMAScript 2017 中,我们可以在生成器函数中使用 yield* 语句,它可以将控制权交给另一个生成器函数,例如:

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

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

----- --- - -------------
------------------------ -- - ------ -- ----- ----- -
------------------------ -- - ------ -- ----- ----- -
------------------------ -- - ------ -- ----- ----- -
------------------------ -- - ------ -- ----- ----- -
------------------------ -- - ------ ---------- ----- ---- -
展开代码

可以看到,当执行到 yield* generator2() 语句时,控制权就被交给了 generator2() 函数,直到 generator2() 函数执行完毕后,控制权才会交回给 generator1() 函数。

2. return() 方法

在 ECMAScript 2017 中,我们可以在生成器函数中使用 return() 方法,它可以使生成器函数立即执行完毕,并返回指定的值,例如:

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

----- --- - ------------
------------------------ -- - ------ -- ----- ----- -
--------------------------- -- - ------ -- ----- ---- -
------------------------ -- - ------ ---------- ----- ---- -
展开代码

可以看到,当执行 gen.return(4) 时,生成器函数立即执行完毕,并返回 4,此时生成器函数已经结束。

3. 异步生成器函数

在 ECMAScript 2017 中,我们可以定义异步生成器函数,它定义方式与普通生成器函数相同,只需在 function* 前加上 async 关键字即可,例如:

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

----- --- - ------------
------ -- -- -
  ----------------- ------------ -- - ------ -- ----- ----- -
  ----------------- ------------ -- - ------ -- ----- ----- -
  ----------------- ------------ -- - ------ -- ----- ----- -
  ----------------- ------------ -- - ------ ---------- ----- ---- -
-----
展开代码

可以看到,异步生成器函数返回的是一个 Promise 对象,我们可以使用 await 关键字等待异步操作完成后再继续执行生成器函数。

总结

通过本篇文章,我们了解了 ECMAScript 2017 中生成器函数的三个新特性:yield* 语句、return() 方法和异步生成器函数。这些新特性为生成器函数带来了更多的功能和灵活性,我们可以更加方便地使用生成器函数来处理数据遍历、异步任务等场景。

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

纠错
反馈

纠错反馈