
generator 生成器函数(yield:放弃、退让、退位的意思
)笔记参考
- 普通的函数 执行到底
-
generator
可以拆解函数,中间可以停下,到yield
处,交出执行权 - 需要使用
next()
方法启动执行,遇到yield
停下,踹一脚走一步 -
generator
函数前面加上*
,背后生成多个小函数,实现走走停停
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() // 最后了,没有结果
yield 是个啥?
-
yield
可以传参 ,可以 返回值 - 第一个
next()
传参无效,只用来启动,从第二个才可以
传参:
function *show(){
alert("111")
let wt=yield;
alert("222"+wt)
}
let gen=show();
gen.next(1); 传参无效,只是负责 启动
gen.next("传入的参数");
返回:
function *show(){
alert("111")
let wt=yield;
alert("222"+wt)
}
let gen=show();
gen.next(1); 传参无效,只是负责 启动
gen.next("传入的参数");
Promise 和 generator 对比实例:
-
Promise 适合一次读一组
-
generator 适合逻辑性的
-
generator 可以控制逻辑,Promise 不带逻辑控制,
// 带逻辑-generator
runner(function * () {
let userData = yield $.ajax({url: 'getUserData'})
if (userData.type == 'VIP') {
let items = yield $.ajax({url: 'getVIPItems'})
} else {
let items = yield $.ajax({url: 'getItems'})
}
})
// yield 实例,用同步方式写异步
server.use(function * () {
let data = yield db.query(`select * from user_table`)
this.body = data
})
网友评论