제너레이터 함수란?
- 제너레이터(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