Generators

Generator는 기본적으로 일시정지(Pause)할 수 있는 함수이다. Generator를 사용하기 위해서는 function 뒤에 *을 붙여주어야 한다.

function* list() {
  yield "first";
  yield "second";
  yield "third";
}

const listG = list();
console.log(list);

list {<suspended>}

yield는 기본적으로 return 이라고 보면 된다. 오브젝트가 suspended되었다고 나오는데 다음과 같이 순서대로 값을 오브젝트 형식으로 받아볼 수 있다.

console.log(listG.next());
console.log(listG.next());
console.log(listG.next());
console.log(listG.next());

{value: “fisrt”, done: false}

{value: “second”, done: false}

{value: “third”, done: false}

{value: undefined, done: true}

순서대로 값을 반환하고 done 여부를 같이 알려준다. 함수를 호출할 수는 있지만 이 이후로는 아무런 값을 받아볼 수 없다.


Generator는 usecase가 많지는 않지만, 다음과 같은 usecase가 존재한다.

// yield 사이에 로직이 존재하는 경우
function* list() {
  ...
  yield "first";

  ...
  yield "second";

  ...
  yield "third";
}
// array 반복문으로 yield하는 경우
const arr = ["first", "second", "third"];
function* list() {
  for (const item of arr) {
    yield item;
  }
}

const arrLooper = list();

Generator도 직접 사용하기보다는 다른 사람들이 만든 라이브러리에서 본다면 로직을 파악할 수 있을 것이다.