제너레이터

승훈·2022년 11월 5일
0

제너레이터 ( Generator )

function* testGen() {
    yield 1;
    yield 2;
    yield 3;
    return 4;
}
  • 위 제너레이터 함수를 호출 하면 바로 코드가 실행되는 것은 x --> 호출하면 '이터레이터(iteraor) 객체'를 반환
  • iterator 반복자 객체를 반환 --> 보통 it 또는 iter 라는 이름으로 받는다.
  • 객체니까 내부적으로 어떤 메서드를 가지게 되는데 ... next() 메서드(제너레이터의 주요 메서드)
const iter = testGen(); // iterator 객체반환 --> 이 객체는 next()메서드가 존재.. next() 실행될때마다 처음 나오는 yield 부분까지 실행하고 멈춘다.
// yield에서 멈췄을 때 yield 뒤에 '값'을 반환.. 만약 '값'이 없다면 undefined 반환
// 결론: next()메서드 --> 항상 value, done 2개의 속성을 가진 '객체'를 반환
// done은 함수 코드 실행이 끝났으면 true / 아니면 false 반환

const firstValue = iter.next();
console.log(firstValue.value);
const secondValue = iter.next();
console.log(secondValue.value);
const thirdValue = iter.next();
console.log(thirdValue);
console.log(iter.next());
function* testGen2() {
    const a = yield 1;
    const b = yield (a + 1);
    const c = yield (b + 2);
    return a*b*c;
}

const it = testGen2();
console.log(it.next());         // {value: 1, done: false}
console.log(it.next(100)); //  a = 100 => {value: 101, done:  false}
console.log(it.next(48));  // b = 48 {value: 50, done: false}
console.log(it.next(2));   // c = 2 {value: 100 * 48 * 2 = 9600, done: true}

제너레이터 함수와 이터레이터 객체의 next() 메서드는 서로 데이터를 주고 받을 수 있다..!
yield 순간.. 제어권을 외부로 넘겨줌.. 따라서 다음 next()로 제어권을 받아왔을 때 yield 이후에 동작이 진행됨

0개의 댓글