자바스크립트 제너레이터

hwakyungChoi·2020년 9월 20일

Generator Function

  • 사용자의 요구에 따라 다른 시간 간격으로 여러 값을 반환할 수 있으며 내부 상태를 관리할 수 있는 함수
function* generatorFunction() { /* ... */ }
  • 제너레이터는 사용자의 요구에 따라 yield, next를 통해서 일시적으로 정지될 수도 있고 다시 시작될 수도 있음
  • 제너레이터의 반환은 제너레이터

Generator

  • 제너레이터의 반환
  • iterable 프로토콜, iterator 프로토콜을 따르는 객체
    - iterable 프로토콜 : 데이터 컬렉션을 순회하기 위한 미리 약속된 규칙
    • iterator 프로토콜 : 반복 가능한 객체의 값을 시퀸스대로 처리하는 프로토콜
  • 제너레이터의 이터러블에서 반환하는 이터레이터는 자기 자신
function* generatorFunction() {
  yield 42;
}

const generator = generatorFunction();

generator === generator[Symbol.iterator]();

// 다음과 같은 방식으로 구현됨
// generator[Symbol.iterator] = () => this;

next, yield

  • yield는 제너레이터 함수의 실행 일시적 정지

  • yield 뒤에 오는 표현식은 caller에 반환

  • return 과 유사

  • yield 부분에서 다음 statement로 진행 여부는 next로 재개할 수 있음

  • next를 programmitically하게 호출하게 하기 위해서는 재귀 호출을 하면 됨

function* sampleGFunction() {
  console.log(yield 10);
  console.log(yield 5);
  console.log(yield 0);
}

function run(gen) {
  const it = gen();

  (function iterate({ value, done }) {
    if (done) {
      return value;
    }

    if (value % 2 === 0) {
      iterate(it.next(value + 1));
    } else {
      iterate(it.next(value));
    }
  })(it.next());
}

run(sampleGFunction);
// 11
// 5
// 1

0개의 댓글