在 ECMAscript2015 中还新增了一种生成器函数,引入这样一个新特性的目的就是为了能够在复杂的异步代码中减少回调函数嵌套过深产生的问题。从而去提供更好的异步编程解决方案,这里先来了解一下,生成器函数的语法以及它的基本应用。生成器函数就是在普通的 function 关键字后面添加一个星号 * ,这样的话普通函数就变成了一个生成器函数。
function * foo () {
console.log('leo');
return 100
};
const result = foo();
/**
* 如果是一个普通的函数这里的执行就应该是先去打印函数体的当中打印的 leo,
* 然后再去打印函数的返回值也就是100
* 而实际上打印出的是生成器对象
*/
console.log(result); // Object [Generator] {}
console.log(result.next()) // leo {value: 100, done: true}
从打印结果来看,生成器对象实际上也实现了 iterator 接口。生成器函数在实际使用的时候,一定会配合另外一个关键词 yield,yield 关键词与 return 关键词非常的类似但是又有很大的不同。yield 关键词并不会结束掉方法的执行,可以多次使用。
function * foo {
console.log('1')
yield 100
console.log('2')
yield 200
console.log('3')
yeild 300
}
const generator = foo();
console.log(generator.next()) // 1 {value: 100, done: false}
console.log(generator.next()) // 2 {value: 200, done: false}
console.log(generator.next()) // 3 {value: 300, done: false}
console.log(generator.netx()) // {value: undefined, done: true}
总结:生成器函数会自动返回一个生成器对象,调用这个对象的 next 方法,才会让这个函数的函数体开始执行。执行过程中一旦遇到了 yield 关键词函数的执行就会被暂停下来,而且 yeild 后面的值将会作为 next 的结果返回,如果在继续调用生成器对象的 next 函数会从暂停的位置继续开始执行一直到这个函数完成,它最大的特点就是惰性执行。