美文网首页
生成器(Generator)

生成器(Generator)

作者: bestCindy | 来源:发表于2022-03-02 23:42 被阅读0次

    什么是生成器

    生成器是一个通过构造函数 Generator 创建的对象,生成器既是一个迭代器,同时又是一个可迭代对象

    如何创建生成器

    生成器的创建,必须使用生成器函数(Generator Function)

    如何书写一个生成器函数

    // 这是一个生成器函数,该函数一定返回一个生成器
    function* method() { }
    

    生成器函数内部是如何执行的

    生成器函数内部是为了给生成器的每次迭代提供数据

    每次调用生成器的 next 方法,将导致生成器函数运行到下一个 yield 关键字为止

    yield 是一个关键字,该关键字只能在生成器函数内部使用,表达“产生”一个迭代数据

    举个例子

    function* method() {
        yield 1;
        yield 2;
        yield 3;
      }
    

    再举个例子,用生成器完成那个经典的斐波那契数列

    function* createFeiboIterator() {
      let prev1 = 1;
          prev2 = 1;
          n = 1;
      while (true) {
        if (n <= 2) {
          yield 1;
        } else {
          const newValue = prev1 + prev2;
          yield newValue;
          prev2 = prev1;
          prev1 = newValue;
        }
        n++;
      }
    }
    
    const iterator = createFeiboIterator();
    

    有哪些需要注意的细节

    • 生成器函数可以有返回值,返回值出现在第一次 done 为 true 时的 value 属性中
    function* method() {
       yield 1;
       yield 2;
       yield 3;
       return 4;
    }
    const iterator = method();
    
    • 调用生成器的 next 方法时,可以传递参数,传递的参数会交给 yield 表达式的返回值
    function* method() {
      let info = yield 1;
      console.log(info);
      info = yield 2 + info;
      console.log(info);
    }
    const iterator = method();
    
    • 第一次调用 next 方法时,传参没有任何意义
    • 再生成器的内部,可以调用其他生成器函数,但是要加 * 号
    function* test1() {
      yield 1;
      yield 2;
    }
    
    function* test2() {
      yield* test1()
      yield 3;
      yield 4;
    }
    
    const iterator = test2();
    

    生成器其他 API

    • return 方法:调用该方法,可以提前结束生成器函数,提前让整个迭代结束
    • throw 方法:调用该方法,可以在生成器中产生一个错误
    function* test() {
        yield 1;
        yield 2;
        yield 3;
    }
    
    const iterator = test();
    

    相关文章

      网友评论

          本文标题:生成器(Generator)

          本文链接:https://www.haomeiwen.com/subject/qifyrrtx.html