함수는 하나의 값을 반환하지만, generator 는 여러개의 값을 필요에 따라서 하나씩 반환(yield)한다.
function* 로 선언할 수 있다.
function* generator() {
yield 1;
yield 2;
return 3;
}
let gen = generator();
console.log(gen.next()); // {value: 1, done: false}
console.log(gen.next()); // {value: 2, done: false}
console.log(gen.next()); // {value: 3, done: true}
console.log(gen.next()); // {value: undefined, done: true}
for.. of
마지막 return 값은 무시한다.
(done : true 일때의 value를 무시함)
function* generator() {
yield 1;
yield 2;
return 3;
}
let gen = generator();
for (let x of gen) {
console.log(x); // 1 , 2
}
spread 문법 사용
도 가능하다.
function* generateSequence() {
yield 1;
yield 2;
yield 3;
}
let sequence = [0, ...generateSequence()];
alert(sequence); // 0, 1, 2, 3
활용
start ~ end 사이의 숫자를 .next() 마다 반환
function* generateSequence(start, end) {
for (let i = start; i <= end; i++) yield i;
}
yield* 문법으로 다른 제너레이터를 끼워넣을 수 있다.
function* generateSequence(start, end) {
for (let i = start; i <= end; i++) yield i;
}
function* generatePasswordCodes() {
// 0..9
yield* generateSequence(48, 57);
// A..Z
yield* generateSequence(65, 90);
// a..z
yield* generateSequence(97, 122);
}
let str = '';
for(let code of generatePasswordCodes()) {
str += String.fromCharCode(code);
}
alert(str); // 0..9A..Za..z
제너레이터는 이제껏하면서 정말 쓸일이 별로없었는데,
redux-saga를 사용할 때 쓴 코드를 본적은 있다.
알아만 두련다..!
반응형
'Archive' 카테고리의 다른 글
stompJS에 기여하기와 한단계 성장한 느낌 (0) | 2022.09.16 |
---|---|
JS 모듈 (0) | 2022.09.04 |
Promise의 5가지 API (0) | 2022.09.04 |
try ... catch 와 에러 핸들링 (0) | 2022.09.04 |
내장 클래스 확장하기 (0) | 2022.09.03 |