익명의 개발노트

Generator 본문

프로그래밍/javascript

Generator

캡틴.JS 2019. 10. 6. 13:34
반응형

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