제너레이터는 ES6에서 등장한 개념으로 함수의 실행을 중간에 멈추고 재개할 수 있는 독특한 기능이다. 실행을 멈출 때 값을 전달할 수 있기 때문에 반복문에서 제너레이터가 전달하는 값을 하나씩 꺼내서 사용할 수 있다.
yield
키워드를 사용하면 함수의 실행을 멈출 수 있다function* generatorFunc() {
yield 10;
yield 20;
return 'finished';
}
const gen = generatorFunc();
gen
은 제너레이터 객체이다function* generatorFunc() {
console.log('1');
yield 10;
console.log('2');
yield 20;
console.log('3');
return 'finished';
}
const gen = generatorFunc();
console.log(gen.next());
console.log(gen.next());
console.log(gen.next());
next
메소드를 호출하면 yield
키워드를 만날 때까지 실행되고, 만나면 데이터 객체를 반환한다yield
키워드를 만나면 done
속성값은 false
가 되고, 만나지 못하면 done
속성값이 true
가 된다done
속성값이 true
가 된 다음부터는 다음 코드를 실행하지 않고 undefined
를 반환한다return
메소드의 매개변수가 데이터 객체의 value
로 전달되고 제너레이터를 종료시킨다return
메소드를 호출하면 데이터 객체의 done
속성값은 참이 된다next
메소드를 호출해도 done
속성값은 참이 된다function* generatorFunc() {
console.log('1');
yield 10;
console.log('2');
yield 20;
console.log('3');
return 'finished';
}
const gen = generatorFunc();
console.log(gen.next());
console.log(gen.return('abc'));
console.log(gen.next());
done
속성값은 참이 된다function* generatorFunc() {
try {
console.log('1');
yield 10;
console.log('2');
yield 20;
console.log('3');
return 'finished';
}
catch (e) {
console.log(e);
}
}
const gen = generatorFunc();
console.log(gen.next());
console.log(gen.throw('some error'));
for of
문과 전개 연산자...
에서 사용할 수 있다function* f() {
yield 10;
yield 20;
yield 30;
}
for (let i of f()) {
console.log(i);
}
// 10
// 20
// 30
const arr = [...f()];
console.log(arr);
// [10, 20, 30]