yield

  • yield 是 ES6 的新关键字,使生成器函数执行暂停,yield 关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的 return 关键字
  • yield 关键词实际返回一个 IteratorResult (迭代器)对象,它有两个属性,valuedone ,分别代表返回值和是否完成
  • yield 无法单独工作,需要配合 generator (生成器)的其他函数,如 next ,懒汉式操作,展现强大的主动控制特性55

生成器

  • 生成器函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同
  1. // 生成器其实就是一个特殊的函数
  2. // 异步编程 纯回调函数 node fs ajax mongodb
  3. // 函数代码的分隔符
  4. function * gen() {
  5. console.log(111)
  6. yield '一只没有耳朵'
  7. console.log(222)
  8. yield '一只没有尾巴'
  9. console.log(333)
  10. yield '真奇怪'
  11. console.log(444)
  12. }
  13. let iterator = gen()
  14. console.log(iterator) // 在其原型是上有 next() 方法
  15. console.log(iterator.next())
  16. console.log(iterator.next())
  17. console.log(iterator.next())
  18. console.log(iterator.next())
  19. // 遍历
  20. for(let v of gen()) {
  21. console.log(v)
  22. }
  1. function * gen(arg) {
  2. console.log(arg)
  3. let one = yield 111;
  4. console.log(one) // 输出 BBB
  5. let two = yield 222;
  6. console.log(two)
  7. let three = yield 333
  8. console.log(three)
  9. }
  10. // 获取迭代器对象
  11. let iterator = gen('aaa')
  12. console.log(iterator.next())
  13. // next 方法可以传入实参
  14. console.log(iterator.next('BBB'))
  15. console.log(iterator.next('ccc'))
  16. console.log(iterator.next('ddd'))

实例

  1. // 异步编程 文件操作 网络操作(ajax,request) 数据库操作 解决回调地狱
  2. function one() {
  3. setTimeout(() => {
  4. console.log(111)
  5. iterator.next()
  6. },1000)
  7. }
  8. function two() {
  9. setTimeout(() => {
  10. console.log(222)
  11. iterator.next()
  12. },2000)
  13. }
  14. function three() {
  15. setTimeout(() => {
  16. console.log(333)
  17. },3000)
  18. }
  19. function * gen() {
  20. yield one()
  21. yield two()
  22. yield three()
  23. }
  24. // 调用生成器函数
  25. let iterator = gen()
  26. iterator.next()