1、定义
function * 函数名{ let obj = yield "生成器函数" }
与普通函数的区别:
1、function后面加了*
2、函数体里有 yield关键字
2、表现
1、调用这个函数,不会立即执行函数体里的内容,返回一个对象
2、通过这个对象的next方法,可以驱动函数的执行,但是并不会执行完,执行到下一个yield关键字的时候,停住
3、调用next()方法返回的结果
- value: yield关键字后面的表达式的内容。
- done:函数是否执行完,执行完返回true,未执行完返回false。 (当生成函数return的执行完,函数执行结束,返回true)
- 函数return的时候,value是return语句的内容,done是true
4、next()方法可以加参数
- next(参数)
- 这个参数会作为上一个yield关键字的返回值
3、作用
1、生成函数可以返回多个值
2、在调用函数之后,可以给函数体里传递数据
3、调用函数的时候,可以控制函数内部的执行
4、可以解决异步问题
4、生成函数执行器
// 写一个生成函数的执行器 function run(gen) { // 编写一段递归调用来执行我们的代码 let lt = gen(); debugger return new Promise((reslove, reject) => { // {value,done} function step(data) { if (data.done) { console.log("递归调用结束了"); reslove(data.value) } else { data.value.then(res => { step(lt.next(res)) }) } } step(lt.next()) }) }
run(initData).then(res => {
console.log(res)
})
5、yield
yield在生成函数中起到了十分重要的作用,就相当于暂停执行并且返回信息。return代表的是终止执行,yield代表的是暂停执行,后续通过调用生成器的next()方法,可以恢复执行。
在一个Generator函数里面,如果我们想调用另一个Generator函数,就需要用到的关键字是:yield*。
function* gen1(){ yield "gen1 start"; yield "gen1 end"; } function* start(){ yield "start"; yield* gen1(); yield "end"; } var ite1 = start(); console.log(ite1.next());//start console.log(ite1.next());//gen1 start console.log(ite1.next());//gen1 end console.log(ite1.next());//end console.log(ite1.next());//undefined