JS Generator yield

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 defined
  • yield 只能在Generator函数内部使用

yield

  • 既可传参,又可以返回
  • 第一个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 }

  

posted @ 2019-07-03 21:33  413Xiaol  阅读(327)  评论(0编辑  收藏  举报