Generator执行步骤浅析

在Generator函数出现之前JS的函数只能返回一个值,返回的方式就是return,但是Generator函数可以返回多个值,返回的方式是yield。并且Generator赋予了外部动态影响函数内部的执行顺序的能力。

基础语法

function* f () {
  const a = yield 1
  console.log(a)
  const b = yield 2
  console.log(b)
}

var ff = f()

ff.next() // {done: false, value: 1}
ff.next(10) // {done: false, value: 2}
ff.next(20) // {done: true, value: undefined}

上面函数执行的时候,并没有开始执行函数体内的内容。当执行ff的next方法的时候开始执行函数体内容,直到yield为止。当遇到yield 则将yield后面的表达式计算出的结果返回到Generator函数外。执行next方法则再次从中断的地方(上次执行yield跳出函数的地方)进入到Generator函数内部执行,而next的参数就被当做yield表达式的计算结果。

有感

通过上面的描述可以看出是yield和next方法做的事情就是转让执行权,当执行遇到yield的时候会将结果返回到函数外,也就是将执行权交到了函数外面,那么什么时候再回来执行Generator内部代码就要看外部什么时候调用next方法。
步骤图片

一个简单让Generator函数自执行函数

function singleCo (ge) {
  var ff = ge()
  
  function next (val) {
    var res = ff.next(val) // 将执行权交到Generator内部
    if (res.done) {
      console.log('Generator函数执行完毕')
    } else {
      console.log(res.value)
      res.value(next) // 将改变执行权的权利交给了,yield出来的chunk函数()
    }
   }
  
  next()
}

上面的函数需要Generator内yield表达式返回的是一个特殊的函数,这个函数会接收一个函数做回调。

function* ge () {
  var a = yield function (cb) {cb(1)}
  console.log(a)
  var b = yield function (cb) {cb(2)}
  console.log(b)
}

开始执行

singleCo(ge) // 会自执行打印出 1 2

参考

Generator 函数的语法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值