Generator

JavaScript의 Generator는 함수의 실행을 일시적으로 중단하고 나중에 이어서 실행할 수 있는 특별한 종류의 함수이다. 이터레이터(iterator)를 생성하며, 여러 값을 생성하고 반복하는 데 유용하다.

사용법

함수 블록 내에서 function* 문법을 사용하여 정의하며, yield 키워드를 통해 값을 생성하거나 일시적으로 함수 실행을 멈출 수 있다.

1. 무한 시퀀스 생성

function* countGenerator() {
  let count = 0
  while (true) {
    yield count++
  }
}
 
const counter = countGenerator()
 
console.log(counter.next().value) // 0
console.log(counter.next().value) // 1
console.log(counter.next().value) // 2
// ...

2. 비동기 작업 관리

function* fetchData() {
  const data1 = yield fetch('https://api.example.com/data1')
  const data2 = yield fetch('https://api.example.com/data2')
  return { data1, data2 }
}
 
const generator = fetchData()
generator
  .next()
  .value.then((result1) =>
    generator.next(result1).value.then((result2) => console.log(result2))
  )

장점

  • 비동기 코드 관리: 비동기 코드를 동기적으로 작성하는 데 도움이 된다.
  • 메모리 효율: 필요한 값만 생성하므로, 무한한 값의 시퀀스를 다룰 때 메모리를 절약할 수 있다.
  • 일시 중단 및 재개: 함수 실행을 일시 중단하고 다시 시작할 수 있으므로, 실행 상태를 보존하면서 작업을 진행할 수 있다.

단점

  • 복잡성: 콜백 함수를 사용하는 것보다 더 복잡하고 이해하기 어려울 수 있다.
  • 브라우저 호환성: ECMAScript 2015(ES6)부터 도입되었으며, 모든 브라우저에서 지원되지 않을 수 있다.