• yield的理解


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

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

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

     

     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方法,可以接收一个参数,作为上个阶段异步任务的返回结果

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

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

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

  • 相关阅读:
    [Unit Testing] Test Mongoose model
    2021CSPJ 组初级真题答案及全部解析
    AcWing 1097. 池塘计数
    AcWing 1076. 迷宫问题
    AcWing 1107 魔板
    K进制试题解析
    AcWing 1100. 抓住那头牛
    AcWing 1106. 山峰和山谷
    AcWing 188. 武士风度的牛
    AcWing 173. 矩阵距离
  • 原文地址:https://www.cnblogs.com/xhliang/p/7985883.html
Copyright © 2020-2023  润新知