yield的理解

yield的理解:yield命令是异步两个阶段的分界线
须要先对迭代器和生成器进行理解:异步

迭代器:是一种支持next()操做的对象。它包含一组元素,当执行next()时,返回其中一个元素;当全部元素都被返回后,生成一个StopIteration异常;函数

生成器:迭代器的一种,是一种特殊的函数,经过使用yield操做将函数构形成迭代器普通的函数有一个入口,有一个返回值;当函数被调用时,从入口开始执行,结束时返回相应的返回值。生成器定义的函数,有多个入口和多个返回值;对生成器执行next()操做,进行生成器的入口开始执行代码,yield操做向调用者返回一个值,并将函数挂起;挂起时,函数执行的环境和参数被保存下来;对生成器执行另外一个next()操做时,参数从挂起状态被从新调用,进入上次挂起的执行环境继续下面的操做,到下一个yield操做时重复上面的过程。spa

 

 function *foo2(x) {
          var y = 2 * (yield (x + 1));
          var z = yield (y / 3);
          return (x + y + z);
      }

      var it2 = foo2( 5 );

      // note: not sending anything into `next()` here
      console.log( it2.next() );       // { value:6, done:false }
      console.log( it2.next(12) );   // { value:8, done:false }
      console.log( it2.next(13) );   // { value:42, done:true }

解析上面的代码:it2建立Generator实例,执行 Generator的next方法,能够接收一个参数,做为上个阶段异步任务的返回结果code

第一次执行next方法返回x+1   =6 函数未执行完毕 ;对象

第二次执行next方法 ,接收一个参数,做为上个阶段异步任务的返回结果(x+1),被函数体内的变量 y接收 y =2*12=24,第二次执行返回 (y/3)=8,函数未执行完毕;blog

第三次执行,从记录的上下文继续执行,接收参数被z接收 z = (y/3),参数13做为上次返回结果(y/3),z=13.执行return 6+24+13=42;函数执行完毕;it

相关文章
相关标签/搜索