Generator

송승찬·2020년 8월 28일
0

TIL

목록 보기
8/52
post-thumbnail

제너레이터 함수란?

  • 제너레이터(Generator) 함수는 이터러블을 생성하는 함수
  • 이터러블 구현이 쉬워지고 따라서 비동기 처리에 유용
  • 함수 코드블럭을 한 번에 실행하지 않고, 멈추었다가 원하는 때에 코드 재시작 가능

왜 사용하게 되었는가?

  • redux-saga를 사용하려 했고, 이를 정의하는 과정에서
    generator가 필요하다는 것을 알게 되어 generator를 찾아보게 되었다.

특징

  • 여러 개의 return 값을 가질 수 있다
  • 제너레이터의 반환 값은 generator객체이고 이 객체는 iterable/iterator이다
  • 따라서 iterator.next()로 generator객체를 실행하고
    그 결과값은 {value,done}을 가진 객체를 반환

정의

  • 함수 키워드 앞에 *를 붙여주고, 반환하고 싶은 값 앞에는return 대신 yield를 사용
function* generator() {
  console.log('gen 1');
  yield gen1;  *첫번째 next 메소드 호출 시 여기까지 실행 후 일시 중단
  console.log('gen 2');
  yield gen2;  * 두번째 next 메소드 호출 시 여기까지 실행 후 일시 중단
  console.log('gen 3');
  yield gen3;  *세번째 next 메소드 호출 시 여기까지 실행 후 일시 중단
  console.log('gen 4'); *네번째 next 메소드 호출 시 여기까지 실행 후 끝
}
  • 제너레이터 함수를 호출하면 제너레이터를 반환한다.
    (함수는 return값을 반환)
  • 제너레이터는 이터러블이며 동시에 이터레이터인 객체이다.
  • generator.next()실행시 { value ,done }값을 가진 객체 반환
    value: yield 뒤에 있는 값을 의미
    done :마지막 yield까지 실행 후, 한 번 더 next()실행시 true를 반환 그 외에는 false반환

const generatorObj = generator();

  • 이터러블 객체의 next method실행
    console.log(generatorObj.next());
  • Point 1
    {value: gen 1, done: false}

console.log(generatorObj.next());

  • Point 2
    {value: gen 2, done: false}

console.log(generatorObj.next());

  • Point 3
    {value: gen 3, done: false}
    네번째 next 메소드 호출: 제너레이터 함수 내의 모든 yield 문이 실행되면 done 프로퍼티 값은 true가 된다.
    console.log(generatorObj.next());
  • Point 4
    {value: undefined, done: true}

참고:https://poiemaweb.com/es6-generator

profile
superfly

0개의 댓글