이 포스트에서는 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
문을 사용하여 작업을 스케줄링할 수 있습니다.
참고문헌:
- TypeScript Handbook - Iterators and Generators
- MDN Web Docs - Symbol.asyncIterator
- MDN Web Docs - for await…of