이터레이터와 제너레이터를 활용한 비동기 프로그래밍

이터레이터와 제너레이터는 자바스크립트에서 비동기 프로그래밍을 구현하는 데 유용한 도구입니다. 이들을 활용하면 비동기적인 작업을 보다 간편하게 처리할 수 있으며, 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다.

이터레이터 (Iterator)

이터레이터는 순차적인 값을 만들어내는 객체입니다. next() 메소드를 통해 값을 하나씩 반환하고, done 프로퍼티를 통해 이터레이터의 완료 여부를 확인할 수 있습니다. 이터레이터를 활용하면 한 번에 하나의 값만 처리하는 방식으로 비동기 작업을 수행할 수 있습니다.

다음은 이터레이터의 사용 예시입니다.

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

const iterator = myIterator();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

제너레이터 (Generator)

제너레이터는 이터레이터를 만들어내는 함수입니다. function* 키워드를 사용하여 제너레이터 함수를 정의하고, yield 키워드를 통해 값을 반환합니다. 제너레이터는 이터레이터와 마찬가지로 여러 개의 값을 순차적으로 반환할 수 있습니다.

다음은 제너레이터 함수를 사용하여 비동기 작업을 처리하는 예시입니다.

function* fetchData() {
  try {
    const data1 = yield fetch('https://api.example.com/data1');
    const data2 = yield fetch('https://api.example.com/data2');

    console.log(data1);
    console.log(data2);
  } catch (error) {
    console.error(error);
  }
}

function run(generator) {
  const iterator = generator();

  function handle(result) {
    if (result.done) return;

    result.value
      .then((data) => handle(iterator.next(data)))
      .catch((error) => iterator.throw(error));
  }

  handle(iterator.next());
}

run(fetchData);

위 예시에서 fetchData 제너레이터 함수는 두 개의 비동기 작업을 처리하고 결과를 출력합니다. run 함수는 이터레이터를 생성하고, 비동기 작업의 결과를 다음 yield 구문으로 전달하여 처리합니다.

마무리

이터레이터와 제너레이터를 활용하면 비동기 프로그래밍을 더욱 간단하고 직관적으로 처리할 수 있습니다. 코드의 가독성과 유지 보수성을 향상시키면서 비동기 작업을 효율적으로 구현할 수 있습니다. 이러한 기능을 제대로 활용하여 유연하고 효율적인 비동기 프로그래밍을 구현해보세요.

#programming #비동기프로그래밍