함수의 실행을 중간에 멈췄다가 재개할 수 있는 기능
📝 구문(Syntax)
function* fn() { yield 1; yield 2; yield 3; return "finish" } const a = fn();
function* fn() {
console.log(1);
yield 1;
console.log(2);
yield 2;
console.log(3);
console.log(4);
yield 3;
return "finish";
}
const a = fn();
a.next()
를 입력하면 함수 중 가장 가까운 yield문
을 만날 때까지 실행되고 데이터 객체를 반환한다.value
와 done
프로퍼티를 갖으며 value
는 yield문
의 값이다. (오른쪽에 입력한 값)undefined
undefined
값을 반환한다.yield문
을 모두 실행하기 이전에 중간에 return
메서드를 실행하면 done
속성값이 true
로 바뀌며 a.next(); 를 호출해도 더이상 value
를 얻어올 수 없다.
throw()
도 done
을 true
로 바꾼다.
예외 처리를 위해 try..catch문을 사용해 보자.
function* fn() {
try {
console.log(1);
yield 1;
console.log(2);
yield 2;
console.log(3);
console.log(4);
yield 3;
return "finish";
} catch (e) {
console.log(e);
}
}
const a = fn();
에러 발생으로 done
속성값이 true
로 바뀌며 a.next(); 를 호출해도 더이상 value
를 얻어올 수 없다.
위의 예제와 동일하게 동작한다.
Symbol.iterator 가 존재하므로 배열 또한 ierable 하다. 즉, 배열은 반복 가능한 객체이다.
iterable
은 for...of
을 적용하여 순회할 수 있다.
function* fn(){
yield 4;
yield 5;
yield 6;
}
const a = fn();
a[Symbol.iterator]() === a; // true
즉, generator
는 iterable
객체이다.
⭐️ 문자열도 동일하게 iterable
이다.
function* fn() {
const num1 = yield '첫번째 숫자를 입력해 주세요.';
console.log(num1);
const num2 = yield '두번째 숫자를 입력해 주세요.';
console.log(num2);
return num1 + num2;
}
const a = fn();
외부로부터 값을 받아올 수 있다.
function* gen1(){
yield "w";
yield "o";
yield "r";
yield "l";
yield "d";
}
function* gen2(){
yield "Hello";
yield* gen1(); // generator 객체 뿐 아니라 반복 가능한 모든 객체가 올 수 있다.
yield "!";
}
구조 분해 할당
을 사용하였을 때, for...of
와 마찬가지로 done
값이 true
가 될 때까지 값을 가져온다.
제너레이터(Generator) 는 다른 작업을 하다가 다시 돌아와서 next() 하여 멈추었던 부분부터 이어서 실행 가능하다.