yield
yield
是 ES6 的新关键字,使生成器函数执行暂停,yield
关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return
关键字yield
关键词实际返回一个IteratorResult
(迭代器)对象,它有两个属性,value
和done
,分别代表返回值和是否完成yield
无法单独工作,需要配合generator
(生成器)的其他函数,如next
,懒汉式操作,展现强大的主动控制特性55
生成器
- 生成器函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同
// 生成器其实就是一个特殊的函数
// 异步编程 纯回调函数 node fs ajax mongodb
// 函数代码的分隔符
function * gen() {
console.log(111)
yield '一只没有耳朵'
console.log(222)
yield '一只没有尾巴'
console.log(333)
yield '真奇怪'
console.log(444)
}
let iterator = gen()
console.log(iterator) // 在其原型是上有 next() 方法
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
// 遍历
for(let v of gen()) {
console.log(v)
}
function * gen(arg) {
console.log(arg)
let one = yield 111;
console.log(one) // 输出 BBB
let two = yield 222;
console.log(two)
let three = yield 333
console.log(three)
}
// 获取迭代器对象
let iterator = gen('aaa')
console.log(iterator.next())
// next 方法可以传入实参
console.log(iterator.next('BBB'))
console.log(iterator.next('ccc'))
console.log(iterator.next('ddd'))
实例
// 异步编程 文件操作 网络操作(ajax,request) 数据库操作 解决回调地狱
function one() {
setTimeout(() => {
console.log(111)
iterator.next()
},1000)
}
function two() {
setTimeout(() => {
console.log(222)
iterator.next()
},2000)
}
function three() {
setTimeout(() => {
console.log(333)
},3000)
}
function * gen() {
yield one()
yield two()
yield three()
}
// 调用生成器函数
let iterator = gen()
iterator.next()