一、概念
generator函数是一种执行过程中可暂停的函数。比如在一个函数中需要发起一次ajax请求,在请求之后再向下执行,这种场景我们可以使用generator函数。
二、语法
1. 定义函数
generator英文翻译为构造器的意思,可以将一个generator函数理解为多个普通函数构成的函数
function * nice () {
console.log(1)
yield
console.log(2)
}
let genObj = show2()
genObj.next() // 1
genObj.next() // 2
- 创建一个generator函数,需在function和函数名之间加一个分号
- generator函数首次执行返回的是一个generator函数对象
- 调用generator函数对象的next方法会执行该函数直到遇到yield关键字
- 再次调用generator函数对象的next方法会继续执行到下一个yield
2. 停顿点yield
generator函数中,我们在哪里暂停这个函数,可用yield关键字实现。
其中yield可用于传参和返回。
(1)传参
function * show() {
console.log('1')
var a = yield
console.log('2')
console.log(a)
}
// yield 传参
var gen = show()
gen.next(6) // 首次调用next传参无效
gen.next(3) // 将yield的值赋为3
(2)返回
function * show() {
console.log('1')
var a = yield 99
console.log('2')
console.log(a)
}
var gen = show()
let res1 = gen.next(6)
console.log(res1) // {value: 99,done: false}
let res2 = gen.next(3)
console.log(res2) // {value: undefined,done: true}
yield的返回值是一个对象,其中有两个属性。value
返回的值,done
当前generator函数是否结束的布尔值。
generator-yield属于es6语法,在es7中出现了语义化更强的async await,欢迎了解