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) // 输出 BBBlet two = yield 222;console.log(two)let three = yield 333console.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()
