제너레이터는 다음과 같이 선언하고 사용할 수 있다.
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
순회에 조건문을 걸 수 있게 된다. 이 외에도 무궁무진한 활용이 가능할 것 같다.
댓글