제너레이터 Generator
- 제너레이터 함수는 이터러블을 생성하는 함수
*
키워드를 붙여 선언
yield 문
: 하나 이상의 키워드를 사용한 기준으로 반환한다
- 이터레이션 프로토콜을 준수한 방식보다 간편하게 이터러블 구현 가능
- 비동기 처리에서 유용
function* counter() {
for (const v of [1, 2, 3]) yield v;
}
let generatorObj = counter();
console.log(Symbol.iterator in generatorObj);
for (const i of generatorObj) {
console.log(i);
}
generatorObj = counter();
console.log('next' in generatorObj);
console.log(generatorObj.next());
console.log(generatorObj.next());
console.log(generatorObj.next());
console.log(generatorObj.next());
- 제너레이터는 이터러블이면서 동시에 이터레이터인 객체
- 1 ) 제너레이터 함수가 생성한 제너레이터 Symbol.iterator()를 소유한 이터러블이며
- 2 ) 제너레이터는 next() 를 소유하며 메소드를 호출 시 value,done 프로퍼티를 갖는 이터레이터 리절트 객체를 반환하는 이터레이터다.
제너레이터 함수 정의
function* genDecFunc() {
yield 1;
}
let generatorObj = genDecFunc();
const genExpFunc = function* () {
yield 1;
};
generatorObj = genExpFunc();
const obj = {
* generatorObjMethod() {
yield 1;
}
};
generatorObj = obj.generatorObjMethod();
class MyClass {
* generatorClsMethod() {
yield 1;
}
}
const myClass = new MyClass();
generatorObj = myClass.generatorClsMethod();
제너레이터 함수 호출과 제너레이터 객체
- 제너레이터 함수 호출 시 코드블록이 실행되는 것이 아닌 제너레이터 객체를 반환
- next() 메서드를 호출하기 위해 Symbol.iterator () 메서드로 이터레이터를 별도 생성할 필요 없음!
/ 제너레이터 함수 정의
function* counter() {
console.log('Point 1');
yield 1;
console.log('Point 2');
yield 2;
console.log('Point 3');
yield 3;
console.log('Point 4');
}
const generatorObj = counter();
console.log(generatorObj.next());
console.log(generatorObj.next());
console.log(generatorObj.next());
console.log(generatorObj.next());
제너레이터 활용
💡 비동기처리
- 비동기 처리를 동기 처리처럼 구현할 수 있다
- 비동기 처리 함수가 처리 결과를 반환하도록 구현 가능
function* multipleGenerator(){
try{
for (let i=0; i<10; i++){
console.log(i);
yeild i ** 2;
}catch(error){
console.log(error);
}
}
const multiple = multipleGenerator();
let next = multiple.next();
console.log(next.value,next.done);
multiple.throw('Error');
next = multiple.next();
console.log(next.value,next.done);