반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- vuex
- App.vue
- State
- webpack
- Vue
- Vue.js
- mapGetters
- Wecode
- CSS
- react
- v-html
- event
- input
- ES6
- MySQL
- nodejs
- scss
- 자료구조
- TypeScript
- express
- sass
- Vue transition
- JavaScript
- 댓글달기
- HOC
- 자바스크립트
- 쉬운설명
- jsx
- 리액트
- storybook
Archives
- Today
- Total
익명의 개발노트
Generator 본문
반응형
1. 정의 : 함수의 실행을 중간에 멈추고 재개 할 수 있는 기능
2. 장점
1) 필요한 순간에 값을 계산하기때문에 불필요한 메모리를 낭비를 방지할 수 있다.
2) 실행을 멈추고 재 시작할 수 있기 때문에 멀티태스킹이 가능하다.
3. 사용법
1) function* 함수명(){} 으로 *를 사용하여 쓴다.
2) yield를 이용해서 함수를 멈출 수 있다.
3) yield 오른쪽에는 iterator값이 들어간다.
4) 결과값은 제네레이터 객체를 반환한다.
5) 제네레이터 객체는 next, return, throw 메서드를 가지고 있다.
function* f1(){
yield 10;
yield 20;
return 'finished';
}
const gen = f1();
위 함수를 실행하려면, gen.next(); 를하면된다.
function* f1(){
yield 10;
yield 20;
return 'finished';
}
const gen = f1();
gen.next(); // {value : 10, done :false}
gen.next(); // {value : 20, done :false}
gen.next(); // {value : 'finished', done :true}
yield가 없으면 done은 true값을 가진다.
yield은 함수를 멈추며, next는 함수를 실행한다.
gen.return('aaa');// {value : 'aaa', done:true}
return 을 사용하면 바로 값을 리턴 받을 수 있다.
또한 아래와같이 필요한 연산만 수행하게 할 수 있다.
function* map(iter, mapper){
for(const v of iter){
yield mapper(v);
}
}
function* filter(iter, test){
for(const v of iter){
if(test(v)){
yield v;
}
}
}
function* take(n, iter){
for(const v of iter){
if(n <=0) return;
yield v;
n--;
}
}
const values = [1,2,3,4,5,6,7,8,9,10];
const result = take(3, map(filter(values, n=> n%2 === 0), n=> n*10));
console.log([...result]);
위의 값은 [20, 40, 60]이 출력된다. take 개수 만큼 걸러진다. 4개로 하면 80까지 출력된다.
아래와 같이 제네레이터 함수끼리도 호출이 가능하고,
function* f1(){
yield 2;
yield 3;
}
function* f2(){
yield 1;
yield* f1(); // or [1,2,3] 등 iterator속성이면 된다.
yield 4;
}
console.log(...f2()); // 1 2 3 4
제네레이터 함수로 데이터 전달이 아래와 같이 가능하다.
function* f1(){
const data1 = yield;
const data2 = yield;
}
const gen = f1();
gen.next();
gen.next(10); //10
gen.next(20); //20
이외에 멀티태스킹 또는 catch를 이용해서 멀티태스킹이 가능하다.
어디다 써야하나...?
반응형
'프로그래밍 > javascript' 카테고리의 다른 글
[...]Spread 연산자?? 연산자가 아니다. (0) | 2020.01.10 |
---|---|
Destructuring (0) | 2020.01.09 |
Async/await/ promise (0) | 2019.08.31 |
ES6 특징 핵심요약 (0) | 2019.05.01 |
Prototype, function Method and class (0) | 2019.04.11 |
Comments