MDN에 쓰여있는 기본 사용 형태
function* gen() {
yield 1;
yield 2;
yield 3;
}
var g = gen(); // "Generator { }"
generator 함수는 *
을 붙여서 일반함수와 구분을 주는데, arrow function 형태로는 사용이 불가능하다. 주로 사용하는 메소드로는 Generator.prototype.next()
가 있는데 yield된 값을 반환해준다.
제너레이터 함수는 함수의 실행을 yield된 지점에서 멈추고, 다시 재개할 수 있다. yield된 시점에서 값을 반환({ value: value, done: true|false }
하고, 이를 이용해서 원하는 값을 하나씩 꺼내 사용할 수 있는 장점이 있다. 배열과 달리 값을 미리 만들어놓지 않으므로, 불필요한 메모리를 세이브할 수 있는 장점이 있다. 따라서 필요한 순간에 값을 계산해서 전달하기 때문에 메모리 측면에서 효율적이라고 한다. 함수내에서는 yield 키워드만 사용할 수 있는 것이 아니고 return 키워드를 통해서 일반 함수와 같이 제너레이터함수의 종료도 명시가 가능하다.
function* testGenerator() {
console.log('첫번째');
yield 1;
console.log('두번째');
yield 2;
console.log('세번째');
console.log('네번째');
yield 3;
console.log('다섯번째');
return 'finished';
}
const tGen = testGenerator(); // 제너레이터 객체 생성
console.log(tGen.next());
// 첫번째
// {value: 1, done: false}
console.log(tGen.next());
// 두번째
// { value: 2, done: false }
console.log(tGen.next());
// 세번째
// 네번째
// {value: 3, done: false}
console.log(tGen.next());
// 다섯번째
// {value: 'finished', done: false}
.env
에 환경변수로 설정해서 사용하자js: process.env.REACT_APP_변수명
.env: REACT_APP_변수=값
REACT_APP_
는 예약어이므로 꼭 prefix로 변수명 앞에 붙여줘야한다.atom
정도에서 끝내고, 백번 양보해서 selector
에서는 인간적으로 끝내자.