function* 키워드로 선언
하나 이상의 yield문 포함
제너레이터 객체 메소드 : next, return, throw
호출하면 value와 done 프로퍼티를 가지는 iterator result 객체를 반환
value : 산출 값
done : 코드 실행이 끝났으면 true, 끝나지 않았으면 false
next 메소드를 호출하면 가장 가까운 yield 문을 만날 때까지 실행된다. yield 문을 만나면 실행을 멈추고(suspend) value를 반환한다.
또 다시 next 메소드를 호출하면 멈춘 위치에서 다시 실행하여 다음 yield 문을 만날 때까지 실행된다.
=> yield : 함수 실행이 일시적으로 멈추는 위치
[⬆예시 코드]
function* genFunc() {
console.log("첫번째 호출");
yield 1; //첫번째 호출 시에는 이 지점까지만 실행된다.
console.log("두번째 호출");
yield 2; //두번째 호출 시에는 이 지점까지만 실행된다.
console.log("세번째 호출");
yield 3; //세번째 호출 시에는 이 지점까지만 실행된다.
yield 4;
yield 5;
yield 6;
}
//호출해도 제너레이터 객체를 생성하기만 하고 함수의 코드는 실행되지 않는다.
let generator = genFunc();
console.log(generator); // Object [Generator] {}
//첫번째 호출
console.log(generator.next()); // { value: 1, done: false }
//두번째 호출
console.log(generator.next()); // { value: 2, done: false }
//세번째 호출
console.log(generator.next()); // { value: 3, done: false }
console.log(generator.return('Hi')); // {value: 'Hi', done: true}
//yield 4, 5, 6이 있음에도 undefined가 반환되는 것을 알 수 있음
console.log(generator.next()); // { value: undefined, done: true }
[⬆예시 코드]
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;
}
const generatorObj = gen(0);
console.log(generatorObj.next()); // 제너레이터 함수 시작
console.log(generatorObj.next(1)); // 제너레이터 객체에 1 전달
console.log(generatorObj.next(2)); // 제너레이터 객체에 2 전달
function* f1() {
try {
console.log('첫번째 호출');
yield 10;
console.log('두번째 호출');
yield 20;
} catch(e) {
console.log('f1-catch', e);
}
}
let generator = f1();
console.log(generator.next()); // {value: 10, done: false}
console.log(generator.throw('에러 발생')); // {value: undefined, done: true}
next 메소드 코드
와 [Symbol.iterator]() 코드
를 내장하고 있기 때문에)[예시 : 무한 피보나치 수열 함수 구현]
function* infinity() {
let i = 0;
while (true) yield ++i;
}
const iter = infinity();
console.log(iter.next().value); // 1
console.log(iter.next().value); // 2
console.log(iter.next().value); // 3
//실행해도 문제가 발생하지 않는 것을 알 수 있다.
참조
https://ko.javascript.info/generators