반응형
ES6에서 도입된 제너레이터(Generator) 함수는 이터러블을 생성하는 함수이다.
제너레이터 함수를 사용하면 이터레이션 프로토콜을 준수해 이터러블을 생성하는 방식보다 간편하게 이터러블을 구현할 수 있다.
기존 Symbol iterator 로 피보나치 수열 구현
function fibonacci(maxi) {
let [first, second] = [0,1];
return {
[Symbol.iterator](){return this;},
next() {
[first, second] = [second, first+second];
return {value: first, done : first>=maxi};
}
}
}
const Fibo = fibonacci(1000);
while(true){
const {value, done} = Fibo.next();
if(done)
break
console.log(value);
}
/* console 결과
VM242:20 1
VM242:20 1
VM242:20 2
VM242:20 3
VM242:20 5
VM242:20 8
VM242:20 13
VM242:20 21
VM242:20 34
VM242:20 55
VM242:20 89
VM242:20 144
VM242:20 233
VM242:20 377
VM242:20 610
VM242:20 987
*/
이제 이 코드를 Generator로 변환해보자.
Generator로 변환
function* counter() {
let count = 0;
console.log(count);
yield count++;
console.log(count);
yield count++;
console.log('done');
}
const cnt = counter();
cnt.next(); // {value: 0, done: false}
cnt.next(); // {value: 1, done: false}
cnt.next(); // {value: undefined, done: true}
파이썬을 해봤다면 yield 문에 대해 한번은 들어봤을것이다.
우선 제네레이터에 대해 간략히 설명하자면
일반 함수와 같이 함수의 코드블록을 한번에 실행하지 않고 필요할때 재시작할 수 있는 특수한 함수이다.
value 값으로 yield 값이 리턴되고, done 값으로 언제 끝날지 알려주게 된다.
generator를 사용하면
다음과 같은 방식으로도 구현 가능하다.
function *ex(){
let a = yield;
let b = yield;
yield a+b;
}
const test = ex();
test.next();
test.next(1); // 인자전달
console.log(test.next(2)); // {value: 3, done: false}
시작지점을 알려준 뒤
인자로 generator 안에 값을 넘겨줄수도 있다.
그럼 fibo 수열을 다시 generator로 구현해보자.
function *fibonacci(){
let [first, second] = [0,1];
while(true){
[first, second] = [second, first+second];
yield first;
}
}
const test = fibonacci();
test.next(); // 1
test.next(); // 1
test.next(); // 2
test.next(); // 3
...
코드가 매우 간략해진것을 확인 가능하다.
generator를 활용해서 무한 수열(Lazy Evaluation), 비동기 처리를 쉽게 활용 가능하다.
다만 좀 더 편리한 async/await 가 생겨서 generator 만으로 비동기 처리를 하지는 않는 편이다.
또한 redux-saga 등 여러 라이브러리에서 사용한다.
reference
https://poiemaweb.com/es6-generator
반응형
'Front-end > JavaScript' 카테고리의 다른 글
pnpm 도입기 (feat: 모노 레포) (0) | 2023.07.15 |
---|---|
자바스크립트의 async/await에 대해서 (0) | 2022.03.31 |
JS로 Single Page Application 구현 (0) | 2022.03.12 |
호이스팅과 var, let에 대하여 (0) | 2022.01.29 |
[이벤트루프] 자바스크립트에서 정확한 타이머 구현? (0) | 2022.01.26 |