이전 강의의 사용자 정의 iterator를 js언어 차원에서 구현한 것
Generator는 well-formed iterator를 생성, 반환하는 함수이다.
function *gen () { // 함수명 앞에 '*'표시를 한다.
yield 1; // yield 키워드를 통해서 순차적으로 반환할 value프로퍼티의 값을 정의할 수 있다.
yield 2;
yield 3;
return -1; // return되는 값은 done프로퍼티의 값이 true가 될 때 반환되는 value프로퍼티 값을 정의한다 !return값은 next()를 통해서만 얻을 수 있는 값
}
generator의 가치는 if, while, for문 등의 조건, 반복문을 통해서 여러 형태의 iterator를 하나의 함수가 만들어낼 수 있다는 것이다.
// 최대값인 n을 인자로 전달해 홀수만 yield하는 함수
function *generateOdds (n) {
for (let i = 0; i < n; i++) {
if (i % 2) yield i
}
}
generator는 next메서드로 yield값을 하나 리턴했다면, 다음 next메서드가 호출될 때까지 실행이 일시정지된다. 평가가 말그대로 중지되며 next메서드가 호출되면 중지된 지점부터 다시 함수가 실행된다.
// 무한으로 'hi'를 value프로퍼티의 값으로 할당하는 generator
function *generateInfiniteHi() {
while (true) yield 'hi'
}
const iterator = generateInfiniteHi();
iterator.next(); // 실행 시, 무한루프로 런타임이 멈추지 않는다. generateInfiniteHi의 실행이 다음 next메서드가 호출될 때까지 작동을 멈춘 것