제너레이터
제너레이터 함수는 function* 키워드로 선언한다. 그리고 하나 이상의 yield 문을 포함한다.
// 제너레이터 함수 선언문
function* genDecFunc() {
yield 1;
}
// 제너레이터 함수 표현식
const genExpFunc = function* () {
yield 1;
};
// 제너레이터 메소드
const obj = {
* generatorObjMethod() {
yield 1;
}
};
yield
제너레이터 버전의 return
키워드로 생각 할 수 있다.
yield
키워드는 실질적으로 value 와 done 이라는 두 개의 속성을 가진 IteratorResult
객체를 반환한다.
value 프로퍼티는 yield 문이 반환한 값이고 done 프로퍼티는 제너레이터 함수 내의 모든 yield 문이 실행되었는지를 나타내는 boolean 타입의 값이다.
function* counter() {
for (const v of [1, 2, 3]) yield v;
// => yield* [1, 2, 3];
}
// for of 문으로 [1, 2, 3]의 값들을 한번 씩 순회하면서 반환
yield 뒤에 있는 것이 value 값
1. { vlaue: 1 done: false}
2. { vlaue: 2 done: false}
3. { vlaue: 3 done: false}
!! 이터레이터의 next 메소드와 다르게 제너레이터 객체의 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;
console.log(res); // res: 3 ⟸ 네번째 next 호출 시 전달한 데이터
return res;
}
const generatorObj = gen(0);
console.log(generatorObj.next()); // 제너레이터 함수 시작
console.log(generatorObj.next(1)); // 제너레이터 객체에 1 전달
console.log(generatorObj.next(2)); // 제너레이터 객체에 2 전달
console.log(generatorObj.next(3)); // 제너레이터 객체에 3 전달