Generator 是 ES6 引入的一种新的语言特性,它是一种能够生成多个值的函数。与普通函数不同的是,Generator 函数能够暂停自己的执行,并在需要时恢复执行。
Generator 函数的语法
Generator 函数使用 function*
声明,其中 *
表示当前函数是一个 Generator 函数。
function* foo() { // ... }
Generator 函数内部使用 yield
语句来生成值。当代码执行到 yield
语句时,函数的执行将会被暂停,并返回一个值。
Generator 函数的执行
Generator 函数必须通过调用 next()
方法才能够执行。调用 next()
方法时,函数将会从上一次暂停的地方继续执行,并返回一个包含两个属性的对象,分别是 value
和 done
。
-- -------------------- ---- ------- --------- ----- - ----- -------- ----- -------- - ----- --- - ------ ------------------------ -- - ------ -------- ----- ----- - ------------------------ -- - ------ -------- ----- ----- - ------------------------ -- - ------ ---------- ----- ---- -
调用 next()
方法时,可以传递一个参数,它将作为上一次 yield
语句的返回值。
-- -------------------- ---- ------- --------- ----- - ----- - - ------ ----- - - ----- -- ----- - - -- - ----- --- - ------ ----------- -- - ------ ---------- ----- ----- - ------------- -- - ------ --- ----- ----- - ------------- -- - ------ --- ----- ----- - ----------- -- - ------ ---------- ----- ---- -
Generator 函数与 Iterator 接口
Generator 函数实现了 Iterator 接口,因此可以使用 for...of
语句进行遍历。
-- -------------------- ---- ------- --------- ----- - ----- -------- ----- -------- - --- ------ ----- -- ------ - ------------------- - -- ------- -- ----- -- -----
应用场景
异步代码展开
Generator 函数对于处理异步代码非常有用。在传统的异步代码中,为了避免回调地狱,必须采用 Promise 或 async/await 这样的语言特性。而在 Generator 函数中,则可以通过使用 yield 语句来暂停函数执行,等待异步操作的结果。
-- -------------------- ---- ------- -------- -------------- - ------ ------------------- -- ------------ - --------- ---------------- - --- - ----- ------- - ----- ------------------------ ----- ------- - ----- ------------------------ ----- ------- - ----- ------------------------ -------------------- -------- --------- - ----- ----- - ------------------- - - -------- ------------------- - ----- --- - ------------ -------- ------------ - ----- - ------ ---- - - ----------------- -- ------- - ---------------- --- -- ---------------- - - ------- - -------------------------
数据流控制
由于 Generator 函数可以生成多个值,所以可以用于控制数据流的生成和消费。
-- -------------------- ---- ------- --------- ------- ---- - --- ---- - - -- - - -- ---- - ----- ----------------- - - --------- ----------- - --- - - -- --- - - -- ----- ------ - ----- ------- - -- - - -- - - ------- - -- ----- -------- - - --- ------ ----- -- -------- ------------- - ------------------- - -- ------- -- - -- - -- - -- - -- - -- - -- - -- -- -- -- -- --
总结
Generator 函数是一种非常有用的语言特性,它能够生成多个值,并在需要时暂停函数执行。它在处理异步代码和控制数据流等场景中非常有用。但是,由于它是一种新的语言特性,因此在使用时需要谨慎考虑,并遵循相应的最佳实践。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c39bba83d39b4881794355