- 제네레이터 함수는 ES6부터 지원되는 자바스크립트의 기능이다.
- 제네레이터 함수를 사용하면, 실행한 함수를 중간에 중단(pause)한 뒤 다시 재개(resumed)할 수 있다.
- 제네레이터 함수가 사용되는 대표적인 예로는 redux saga가 있다.
- 중간 중간에 중단점이 있음으로써, 디버깅에 큰 도움이 된다.
const generator = function* () {
console.log("1st");
yield;
console.log("2nd");
yield;
console.log("3rd");
yield 3;
};
generator
- genetator 함수는 위와같이 function*() {} 의 형태로 작성할 수 있다.
- 기존의 함수 선언식에 *을 붙여준 모양새이다.
- yield는 단순히 표현하면 중단점으로, 함수가 실행될 때 마다 멈추는 지점을 의미한다.
const fnGen = generator();
fnGen.next();
- 선언된 제네레이터 함수는 바로 사용할 수는 없고, 실행하여 변수에 할당한 뒤 next() 메서드를 통해 실행한다.
- next 메서드를 통해 위의 제네레이터 함수를 처음 실행하면 1st가 콘솔에 찍힌다.
const a = fnGen.next();
const b = fnGen.next();
- 그 다음에 두 번 더 next 메서드를 실행할 수 있는데, 이번엔 리턴값을 받아본다.
- a 변수가 선언된 행이 실행되었을 때, 2nd가 콘솔에 출력되고 변수 a에는 {value: undefined, done: false} 값이 담긴다.
- 그 다음 b 변수가 선언된 행이 실행되면, 3rd가 콘솔에 출력되고 변수 b에는 {value: 3, done: false} 가 할당된다.
- yield는 return 처럼 값을 넘겨줄 수 있으며, 넘겨준 값은 객체 내부에 value에 담겨진다.
const fin = fnGen.next();
- 마지막으로 한 번더 next 메서드를 실행하면, 이미 모든 코드는 실행이 완료되었지만 오류 없이 값을 반환한다.
- {value: undefined, done: true} 라는 값이 fin에 담기는데, 지금까지와는 다르게 done 프로퍼티의 값이 true로 제네레이터 함수의 실행이 끝났음을 알린다.
- 제네레이터 함수 내부에 while문을 사용하여 영원히 끝나지 않는 제네레이터 함수를 만들 수도 있다.
let count = 0;
const generator = function* () {
while (true) {
yield count++;
}
};
const fnGen = generator();
- 위의 제네레이터 함수는 아무리 next해도 done이 true가 되지 않는다.
- 또한, 실행할 때 마다 count의 값이 1씩 증가함을 알 수 있다.
redux saga에서는 fork나 call로 제네레이터 함수를 실행할 수 있다. (fork는 동기 함수, call은 비동기 함수)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator
Generator - JavaScript | MDN
The Generator object is returned by a generator function and it conforms to both the iterable protocol and the iterator protocol.
developer.mozilla.org
'JavaScript' 카테고리의 다른 글
NPM에 패키지 배포하고 사용해보기 (+ 타입스크립트) (0) | 2023.02.09 |
---|---|
javascript에서 class 사용하기 (0) | 2023.02.04 |
javascript 스코프와 실행 컨텍스트 (0) | 2023.01.31 |
javascript의 호이스팅(hoisting) 알아보기 (0) | 2023.01.24 |
util.format() 으로 문자열 동적 생성하기 (0) | 2023.01.18 |