3-4 Promise Generator

37 阅读1分钟

Generator (生成器) 普通函数在函数结束之前不会执行其他,Generator 可以在执行的过程中暂停之后再执行,

简单地说,迭代器就是实现了next()方法的一类特殊的对象。这个next()方法的返回值是一个对象,包含了value和done两个属性。

Generator 的特点是有一个 * 号

function* foo(){
  for(let i = 0; i < 3; i++){
    yield i
  }
}
console.log(foo())
let f = foo()
console.log(f.next())  // 返回的是一个对象 {value:0, done: false}
console.log(f.next())  // 返回的是一个对象 {value:1, done: false}
console.log(f.next())  // 返回的是一个对象 {value:3, done: false}
console.log(f.next())  // 返回的是一个对象 {value:undefined, done: true}
  • next()方法的返回值中:value的值是从对象中取出的值,done代表迭代是否结束,如果为true说明迭代器中没有更多的值可以取了。

  • yield 只能在生成器里面使用

// 错误案例
function* gen(args){
  args.forEach(item => {
    yield item + 1
  })
}

实例:

function* gen(x) {
  let y = 2 * (yield(x+1))
  let z = yield(y /3)
  return x + y + z
}

// let g = gen(5)
// console.log(g.next()) // 6
// console.log(g.next()) // NaN
// console.log(g.next()) // NaN


let g = gen(5)
console.log(g.next()) // 6
console.log(g.next(12)) // y = 24 / 3   得出结果 8
console.log(g.next(13)) // z = 13 x = 5 y = 24   得出的结果是 42
  • next() 后面是可以传递参数的,返回的结果根据 Generator 上一层的返回值
function* cont(x = 1){
  while (true) {
    if(x % 7 === 0){
      yield x
    }
    x++
  }
}
let n = count()
console.log(n.next().value) // 7
console.log(n.next().value) // 14
console.log(n.next().value) // 21