[JS]発電機


いわゆる「デジタルジェネレータ」(Generator)

  • イテレーションとイテレーションを作成する関数
  • サードパーティは、必要に応じて複数の値
  • を返すことができる.
    1つの特殊な関数は、必要に応じて実行を停止し、必要に応じて
  • の通常の関数のように関数のコードを一度に実行するのではなく、再起動することができる.
  • 通常関数は、戻り値を戻り文として返しますが、jner layerが呼び出されると、jner layerはjner layer(小さくて小さいオブジェクト=>Symbol.iteratorメソッド)を返します.

    定義と構造


  • function*キーワードとして宣言

  • 1つ以上の最終品目文を含む

  • jner layerオブジェクトメソッド:next、return、throw
  • ①nextメソッド


  • 呼び出し時にvalueとdone propertyを持つ反復器結果オブジェクトを返す

  • value:計算値

  • done:コードの実行が完了した場合はtrue、完了していない場合はfalse

  • 最近の最終品目文に遭遇するまでnextメソッドを呼び出します.最終文に遭遇した場合、実行を停止し、valueを返します.

  • nextメソッドを再度呼び出すと、次の最終品目文に遭遇するまで停止した場所で再実行されます.

  • =>yield:関数が一時停止を実行する場所
  • [サンプルコード]
    function* genFunc() {
        console.log("첫번째 호출"); 
        yield 1;  //첫번째 호출 시에는 이 지점까지만 실행된다.
        console.log("두번째 호출");
        yield 2;  //두번째 호출 시에는 이 지점까지만 실행된다.
        console.log("세번째 호출");
        yield 3;  //세번째 호출 시에는 이 지점까지만 실행된다.
        
        yield 4;
        yield 5;
        yield 6;
    }
    
    //호출해도 제너레이터 객체를 생성하기만 하고 함수의 코드는 실행되지 않는다.
    let generator = genFunc();
    
    console.log(generator);         // Object [Generator] {}
    
    //첫번째 호출
    console.log(generator.next());  // { value: 1, done: false }
    
    //두번째 호출
    console.log(generator.next());  // { value: 2, done: false }
    
    //세번째 호출
    console.log(generator.next());  // { value: 3, done: false }
    
    console.log(generator.return('Hi'));  // {value: 'Hi', done: true}
    
    //yield 4, 5, 6이 있음에도 undefined가 반환되는 것을 알 수 있음
    console.log(generator.next()); // { value: undefined, done: true } 
    
  • nextメソッドにパラメータを追加し、コントローラ関数に渡すことができます.
  • [サンプルコード]
    function* gen(n) {
        let res;
        res = yield n;    // n: 0 ⟸ gen 함수에 전달한 인수
      
        console.log(res); // res: 1 ⟸ 두번째 next 호출 시 전달한 데이터
        res = yield res;
      
        console.log(res); // res: 2 ⟸ 세번째 next 호출 시 전달한 데이터
        res = yield res;
      }
      const generatorObj = gen(0);
      
      console.log(generatorObj.next());  // 제너레이터 함수 시작
      console.log(generatorObj.next(1)); // 제너레이터 객체에 1 전달
      console.log(generatorObj.next(2)); // 제너레이터 객체에 2 전달
  • 第1次nextメソッド呼び出しは、サードパーティ関数を起動する役割のみを果たす
  • .
    データは
  • nextメソッドの引数によって伝達することができ、伝達された引数は完成品キーワードの結果値
  • とすることができる.

    ②戻り方

  • を呼び出すとdoneの値が真になります.以降nextメソッドを呼び出してもdoneは忍耐力を維持し続ける.
  • が呼び出され、パラメータが追加され、その値が値となります.nextメソッドが呼び出されると、valueの値はundefinedになります.
  • ③投げ方

  • try-catch文を使用してサードパーティ関数で例外処理
  • を実行する.
  • メソッド呼び出し時に異常が発生し、catch文
  • に入る
  • doneの値はtrueです.
  • function* f1() {
        try {
            console.log('첫번째 호출');
            yield 10;
            console.log('두번째 호출');
            yield 20;
        } catch(e) {
            console.log('f1-catch', e);
        }
    }
    
    let generator = f1();
    console.log(generator.next()); // {value: 10, done: false}
    console.log(generator.throw('에러 발생')); // {value: undefined, done: true}

    数学者の強み

  • のイテレーションプロトコルを遵守することで、イテレーションをより簡単に実現できます.
    (next 메소드 코드および[Symbol.iterator]() 코드が内蔵)
  • [例:無限フィボナッチ数列関数の実装]

    評価値は
  • next法により遅延させることができる.
    (=>無限ループを作成しても問題なく、メモリを効率的に使用できます.)
  • function* infinity() {
        let i = 0;
        while (true) yield ++i; 
    }
    
    const iter = infinity();
    
    console.log(iter.next().value); // 1
    console.log(iter.next().value); // 2
    console.log(iter.next().value); // 3
    //실행해도 문제가 발생하지 않는 것을 알 수 있다.
  • は同時にプログラミングすることができる.
    (=>nextとyieldにより、関数コードは実行、停止できるため、同期プログラミングが可能)
    (サードパーティ関数yieldキーワードによりサードパーティオブジェクトの実行/呼び出しを自動的に停止するnextメソッドは、サードパーティ関数を再実行する)
  • .

    リファレンス


    https://velog.io/@rohkorea86/Generator-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%9D%B4%ED%95%B4%ED%95%B4%EB%B3%B4%EC%9E%90-%EC%9D%B4%EB%A1%A0%ED%8E%B8-%EC%99%9C-%EC%A0%9C%EB%84%A4%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%8D%A8%EC%95%BC-%ED%95%98%EB%8A%94%EA%B0%80#1-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%8A%B9%EC%84%B1%EC%9D%84-%EB%8F%99%EA%B8%B0%EC%A0%81-%EC%BD%94%EB%93%9C%EB%B0%A9%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EA%B4%80%EB%A6%AC-%ED%95%B4%EC%A4%8D%EB%8B%88%EB%8B%A4
    https://ko.javascript.info/generators
    https://poiemaweb.com/es6-generator
    https://mygumi.tistory.com/370