什么是Generator 函数

Generator函数是ES6提供的一种异步编程解决方案,形式上也是一个普通函数,但却可以分步执行。
更新于: 2021-12-19 12:57:29

含义

在Javascript中,一个函数一旦开始执行,就会运行到最后或遇到return时结束,运行期间不会有其它代码能够打断它,也不能从外部再传入值到函数体内

而Generator函数(生成器)的出现使得打破函数的完整运行成为了可能,其语法行为与传统函数完全不同

 

特点

Generator函数是ES6提供的一种异步编程解决方案,形式上也是一个普通函数,但有几个显著的特征:

  • function关键字与函数名之间有一个星号 "*" (推荐紧挨着function关键字)
  • 函数体内使用 yield 表达式,定义不同的内部状态 (可以有多个yield)
  • 直接调用 Generator函数并不会执行,也不会返回运行结果,而是返回一个遍历器对象(Iterator Object)
  • 依次调用遍历器对象的next方法,遍历 Generator函数内部的每一个状态

示例:传统函数一次行执行完

// 传统函数
function foo() {
  return 'hello world';
}

foo(); // 'hello world',一旦调用立即执行

示例:Generator 函数可以多次执行

// Generator函数
function* generator() {
  yield 'status one'; // yield 表达式是暂停执行的标记
  yield 'status two'
  return 'hello world';
}

let iterator = generator(); // 调用 Generator函数,函数并没有执行,返回的是一个Iterator对象
iterator.next(); // {value: "status one", done: false},value 表示返回值,done 表示遍历还没有结束
iterator.next(); // {value: "status two", done: false},value 表示返回值,done 表示遍历还没有结束
iterator.next(); // {value: "hello world", done: true},value 表示返回值,done 为 true,表示已经结束
iterator.next(); // { value: undefined, done: true },继续执行则为 undefined 了

// 冷知识: 其实可以用 iterator.return(); 一步到 done;

yield 表达式

yield 表达式只能用在 Generator 函数里面,用在其它地方都会报错

 

yield 表达式和return语句的区别

  • 相似:都能返回紧跟在语句后面的那个表达式的值
  • 区别:
    • 每次遇到 yield,函数就暂停执行,下一次再从该位置继续向后执行;而 return 语句不具备记忆位置的功能
    • 一个函数只能执行一次 return 语句,而在 Generator 函数中可以有任意多个 yield

next() 方法的参数

yield表达式本身没有返回值,或者说总是返回undefined。next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值

 

yield.return('ending')

Generator 函数返回的遍历器对象,还有一个 return 方法,可以返回给定的值(若没有提供参数,则返回值的value属性为 undefined),并且**终结**遍历 Generator 函数

 

参考

https://www.cnblogs.com/rogerwu/p/10764046.html