[typescript] 비동기 이터레이션과 await for...of 문을 사용하여 작업 스케줄링하는 방법

이 포스트에서는 TypeScript에서 비동기 이터레이션 및 await for...of 문을 사용하여 작업을 스케줄링하는 방법에 대해 살펴보겠습니다.

1. 비동기 이터레이션을 사용한 작업 스케줄링

비동기 이터레이션은 Symbol.asyncIterator 메서드를 구현하여 생성된 이터러블에서 작업을 비동기적으로 반복하는 기능을 제공합니다. 이 특성을 사용하면 for...await...of 루프를 사용하여 이터러블의 각 항목에 대해 비동기 작업을 수행할 수 있습니다.

아래 예제는 Symbol.asyncIterator 메서드를 구현한 비동기 이터러블 클래스의 예시입니다.

class AsyncIterableExample {
  constructor(private data: number[]) {}
  async *[Symbol.asyncIterator]() {
    for (const item of this.data) {
      // 비동기 작업 수행
      yield await this.asyncOperation(item);
    }
  }
  
  private asyncOperation(item: number) {
    return new Promise<number>((resolve) => {
      // 비동기 작업 수행
      setTimeout(() => {
        resolve(item * 2);
      }, 1000);
    });
  }
}

const iterable = new AsyncIterableExample([1, 2, 3]);

(async () => {
  for await (const result of iterable) {
    console.log(result);
  }
})();

위 예제에서는 AsyncIterableExample 클래스가 Symbol.asyncIterator 메서드를 구현하여 비동기 이터러블을 생성합니다. 그리고 for...await...of 루프를 사용하여 이터러블의 각 항목에 대해 비동기 작업을 수행하고 있습니다.

2. await for…of 문을 사용한 작업 스케줄링

for...of 루프는 이터러블 객체를 통해 반복하면서 각 항목에 대해 작업을 수행합니다. TypeScript에서는 await 키워드를 사용하여 for...of 루프 내에서 비동기 작업을 수행할 수 있습니다.

아래 예제는 await for...of 문을 사용하여 배열의 각 항목에 대해 비동기 작업을 수행하는 방법을 보여줍니다.

async function asyncOperation(item: number): Promise<number> {
  return new Promise<number>((resolve) => {
    // 비동기 작업 수행
    setTimeout(() => {
      resolve(item * 2);
    }, 1000);
  });
}

const dataArray = [1, 2, 3];

(async () => {
  for await (const result of dataArray) {
    const processedResult = await asyncOperation(result);
    console.log(processedResult);
  }
})();

위 예제에서는 await for...of 문을 사용하여 배열 dataArray의 각 항목에 대해 비동기 작업을 수행하고 있습니다.

이렇게 TypeScript에서 for...await...of 루프를 이용하여 비동기 이터레이션과 await for...of 문을 사용하여 작업을 스케줄링할 수 있습니다.

참고문헌:

  1. TypeScript Handbook - Iterators and Generators
  2. MDN Web Docs - Symbol.asyncIterator
  3. MDN Web Docs - for await…of