본문 바로가기
카테고리 없음

[Javascript] 제너레이터

by 자몬다 2020. 2. 9.

제너레이터는 다음과 같이 선언하고 사용할 수 있다.

 

function *generator() {
	yield 1;
	yield 2;
	yield 3;
}

let a = generator();
a.next();
>> {value: 1, done: false}
a.next();
>> {value: 2, done: false}
a.next();
>> {value: 3, done: false}
a.next();
>> {value: undefined, done: true}

for (const item of generator()) console.log(item); // 이렇게 순회도 가능하다.

만약 리턴값이 있는 경우,

function *generator() {
	yield 1;
	yield 2;
	yield 3;
	return 'result';
}

.next()의 마지막 결과로 done: true일 때, value가 리턴값이 된다.

위 예제의 경우 네번째 a.next()의 값이 {value: 'result', done: true}가 나온다.

 

제너레이터를 처음 봤을때, 대체 어떤 경우에 활용할 수 있을지 상상이 잘 되지 않았다.

막연히 디버깅 모드랑 비슷하게 작동하는 것 같다는 생각만 했었다.

 

제너레이터는 javascript 순회를 확장시켜준다.

 

예를들어 어떤 동물이 어떤 행동을 할 수 있는지 출력하는 함수를 예로 들 수 있다.

function *whatCanIDo(animal){ 
  if(animal.fly) yield 'I can fly'; 
  if(animal.walk) yield 'I can walk'; 
  if(animal.bark) yield 'I can bark';
  if(animal.swim) yield 'I can swim'; 
}

const bird = {'fly': true, 'walk': true, 'bark': false}

for(const action of whatCanIDo(bird)) console.log(action);

>> I can fly I can walk

순회에 조건문을 걸 수 있게 된다. 이 외에도 무궁무진한 활용이 가능할 것 같다.

 

댓글