이터레이터를 사용해 자신의 실행을 제어하는 함수를 말한다.
일반 함수는 하나의 값 또는 0개의 값만 반환을 하는데, 제너레이터를 사용하면 여러값을 반환하는 것이 가능하다.
제너레이터를 만들 때는 제너레이터 함수라는 함수를 사용해야 한다.
function* generatorSequence() {
yeild 1;
yeild 2;
return 3;
};
generator 함수를 호출하면 코드가 실행되는 것이 아닌, 실행을 처리하는 특별객체 "제너레이터 객체"가 반환된다.
let generator = generateSequence();
console.log(generator); // [Object Generator]
next메소드는 제너레이터의 주요 메소드이다. 가장 가까운 yeild문을 만날 때까지 실행이 지속되며, yeild <value>문을 만나면 value가 바깥으로 반환된다. next()는 항상 두개의 프로퍼티를 가진 객체를 반환하는데, 모양은 아래와 같다.
let one = generator.next();
console.log(JSON.stringify(one)); // {value: 1, done: false}
value와 함께 함수 코드의 실행이 끝났는지의 여부를 반환해주는데, 실행이 끝났다면 done:true, 아니라면 done: false를 반환한다.
return문을 만나기 전까지는 함수의 실행이 끝난 것이 아니기 때문에, 위 코드에선 next()를 두 번 호출하기 전까지는 done: false가 반환되고, next()를 세 번째 호출하면 비로소 done: true로 반환된다.
제너레이터는 이터러블 객체이다. 즉 for of 반복문을 사용해 값을 얻을 수 있다.
for(let value of generator) {
console.log(value); // 1, 2
}
for of 로 내부에 있는 value를 조회하는데 2까지만 조회되는 이유는 뭘까?
for of 이터레이션이 done: true는 무시하기 때문
3까지 조회되게 만드려면 return을 yeild로 바꿔주면 된다.