Generator[生成器]

定义

  1. 是一个特殊的迭代器,是一种函数控制、使用的方案,它可以让我们更加灵活的 控制函数什么时候执行、暂停执行
  2. 生成器函数
    (1) 定义: function 之后 添加 * 号就是生成器函数,可以搭配 yield 控制代码的执行流程,返回一个生成器(对象)
    (2) 关键字: yield [控制代码的执行流程] 每一个yield就是一个暂停,yield可以用来返回值
    (3) 与return 区别 : return 不执行后面的代码,结束执行,yield只是暂停
let foo=function*() {
  console.log(1)
  yield 2
  console.log(3)
}
let genObj=foo()
let value=genObj.next() -->1
console.log(value) --> { done:false, vlaue: 2 }
genObj.next() -->3

注意: 如果需要在某个yield代码块中获取next函数传递的参数,需要用上一个yield去接收

let foo=function*() {
  let value=yield 2
  console.log(value**3)
  yield 2

}
let genObj=foo()
genObj.next()
genObj.next(2)

return方法

  1. 定义: 终止生成器函数,返回传递的参数,并阻止接下来的next( )方法
    let add=function*() {
      console.log(11)
      let value=yield 222 // 接收第二个next函数传递的参数
      yield 222*value
      console.log(3333)
    }
    let genAdd=add()
    
    let value = genAdd().return(2) --> { done:true, value: 2 }
    
    // 不执行
    genAdd.next()
    

throw方法

  1. 定义: 终止生成器函数,抛出异常,如果不捕获异常会阻止接下来的next( )方法,捕获则会继续执行接下来的生成器对象方法
    let add=function*() {
      console.log(11)
      yield
      try {
          console.log(22)
          yield
      } catch(err) {
          console.log(err)
      }
      yield
      console.log(33)
    }
    let genAdd=add()
    genAdd.next()
    genAdd.next()
    genAdd.throw('error')
    genAdd.next()

yield*

  1. 定义: 迭代可迭代对象
    function* genArr(arr){
      yeild* arr  
      /* 等价于 */
      for( item of arr ){
          yield item
      }
    } 
    
    let arr = genArr( [1,2,3] )

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!