function* 함수명() {} // 제너레이터 정의
yield 값 // 값을 반환
제너레이터를 사용해 반복자를 간단히 사용하는 방법이 있으며, 반복자를 정의할 수도 있습니다. 정의는 다음과 같이 function 선언에 *
(애스터리스크, asterisk) 를 추가합니다.
// 제너레이터 정의
function* myGenerator() {}
반복자는 '반복자.next()' 를 사용해 값에 차례대로 접근할 수 있습니다. 제너레이터는 yield 를 사용해 다음 가져올 값을 지정합니다.
function* myGenerator() {
yield '사자';
yield '호랑이';
yield '여우';
}
반복 가능한 객체로 생성되므로 next()나 don을 사용할 수 있습니다.
function* myGenerator() {
yield '사자';
yield '호랑이';
yield '여우';
}
const myIterable = myGenerator();
// next() 로 값을 하나씩 가져옴
console.log(myIterable.next().value);
console.log(myIterable.next().value);
console.log(myIterable.next().value);
console.log(myIterable.next().done);
for...of 를 사용해서 각 값에 접근할 수 있습니다.
function* myGenerator() {
yield '사자';
yield '호랑이';
yield '여우';
}
const myIterable = myGenerator();
// for...of 를 사용해 값에 접근
for (let value of myIterable) {
console.log(value)
}
yield 는 해당 시점에서 함수의 실행을 멈추고 next() 가 호출되면 다시 실행되는 특성이 있습니다. 다음의 제너레이터에서 생성된 반복자는 1초마다 next() 를 실행하여 각각의 문자를 출력합니다.
function* myGenerator() {
console.log('안녕하세요');
yield 1000;
console.log('오늘은 날씨가 좋아요');
yield 2000;
console.log('내일은 비가 올 것 같아요');
yield 3000;
}
const myIterable = myGenerator();
setInterval(() => {
console.log(myIterable.next().value);
}, 1000);
제너레이터의 사용 예로 지정 범위의 정수를 하나씩 반환하는 샘플을 확인합니다. while() 내부의 yield 가 실행될 때 마다 함수가 정지되고 next() 가 호출되면 재실행됩니다.
// 제너레이터 정의
function* range(start, end) {
let result = start;
while (result <= end) {
yield result;
result++;
}
}
// 사용 예
for (let value of range(2, 6)) {
console.log(value); // 결과 2, 3, 4 ,5, 6
}