Generator Function은 사용자의 요구에 따라 다른 시간 간격으로 여러 값을 반환할 수 있습니다.
일반 함수 => 단 한 번의 실행으로 함수 끝까지 실행됩니다.
제너레이터 함수 => 사용자의 요구에 따라 일시적으로 정지될 수도 있고, 다시 시작될 수도 있습니다.
//Generator 함수는 * 을 꼭 붙여주어야 합니다.
function* sayNumbers(){
yield 1;
yield 2;
yield 3;
}
const number = sayNumbers();
console.log(number.next()); //{value: 1, done: false}
yield ( 양보하다 )
yield는 제너레이터 함수의 실행을 일시적으로 정지시킵니다.
즉, 일반 함수의 return과 매우 유사합니다.
제너레이터 함수를 사용할 때 next() 함수를 통해 값을 가져올 수 있는데 해당 부분이 iterator 와 굉장이 유사한 모습을 보여주고 있습니다.
이유는 Generator 는 Iterable하면서 Iterator인 객체의 특별한 종류이기 때문입니다.
계산의 결과 값이 필요할 때까지 계산을 늦춰서 필요한 데이터를 필요한 순간에 생성합니다.
function* createIds(){
let index = 1;
while(true){
yield index++;
}
}
const gen = createIds();
console.log(gen.next().value); //1
console.log(gen.next().value); //2
console.log(gen.next().value); //3
console.log(gen.return(10)); //{value: 10, done: true}
console.log(gen.next()); //{value: undefined, done: true}
그리고 return 함수를 사용하면 강제로 값을 넣어주면서 iterator를 끝낼 수 있습니다.
function* generatorFunction(){
yield* [1,2,3];
}
const generator = generatorFunction();
for(const number of generator){
console.log(number);
}
//1
//2
//3
//undefined