function show() {
console.log(‘a‘)
console.log(‘b‘)
}
show() // 普通函数
function *show2() {
console.log(‘1‘)
yield
console.log(‘2‘)
}
let genObj = show2()
genObj.next() // 1
genObj.next() // 2
genObj.next()
需要调用next()方法启动执行,需要遇到 yield 停
generator函数前面加一个 * 两边可以有空格,或靠近函数或function
如果函数前漏掉 *
yield会报错, ReferenceError: yield is not definedyield
next()传参无效,只用来启动给yield穿参数
function * show() {
console.log(‘1‘)
var a = yield
console.log(‘2‘)
console.log(a)
}
var gen = show()
gen.next() // 1
gen.next() // 2 和 undefined
var gen = show()
gen.next(10) // 1
gen.next(20) // 2 和 20
如果要给第一个yield前的语句传参,可以把参数加在函数里,但是这个参数是整个生成器共享,即第二个yield也可以拿到
function * show(p) {
console.log(‘1‘)
console.log(p)
var a = yield
console.log(‘2‘)
console.log(a)
console.log(p)
}
var gen = show(10)
gen.next() // 1 和 10
gen.next(20) // 2 和 20 10
利用yield返回值
// yield 返回
function * show() {
console.log(‘1‘)
yield 10
console.log(‘2‘)
}
var gen = show()
var res1 = gen.next()
console.log(res1) // { value: 10, done: false }
var res2 = gen.next()
console.log(res2) // { value: undefined, done: true }
如果要给最后一个yield执行后返回值,可以利用return
function * show() {
console.log(‘1‘)
yield 10
console.log(‘2‘)
return 20
}
// yield 返回
var gen = show()
var res1 = gen.next()
console.log(res1) // { value: 10, done: false }
var res2 = gen.next()
console.log(res2) // { value: 20, done: true }
原文:https://www.cnblogs.com/413xiaol/p/11129240.html