자바스크립트 - 비동기 반복
안녕하세요, 미래의 자바스크립트 마법사 여러분! 오늘 우리는 비동기 반복의 세계로 흥미로운 여정을 떠납니다. 이 단어들이 조금 두려워 보일 수 있지만, 이 수업이 끝나면 당신은 이 강력한 개념들을 프로처럼 자신감 있게 사용할 수 있을 것입니다. 그麼, 시작해보겠습니다!
비동기 반복
비동기 반복이란?
여러분이 바쁜 커피숍에 있는 상상해보세요. 주문을 하고, 카운터 앞에서 기다리는 대신, 커피가 준비되는 동안 친구들과 앉아 이야기합니다. 이것이 프로그래밍에서 비동기 연산의 본질입니다 - 작업을 시작하고 그것이 완료되는 동안 다른 일을 합니다.
비동기 반복은 이 개념을 한 단계 더 발전시킵니다. 여러분이 여러 커피를 주문하고, 각 커피가 준비되면 바로 가져다주는 것처럼, 카운터로 계속 확인할 필요 없이입니다.
자바스크립트에서 비동기 반복은 비동기 데이터 소스를 자연스럽고 순차적으로 작업할 수 있게 해줍니다. 비록 연산이 배경에서 일어나고 있지만 말입니다.
비동기 연산 이해하기
비동기 반복에 들어가기 전에, 먼저 자바스크립트에서 비동기 연산을 이해해보겠습니다.
프롬이스: 기본 블록
프롬이스는 비동기 자바스크립트의 기본 개념입니다. 프롬이스는 현재는 사용할 수 없지만 미래에 해결될 값을 나타냅니다.
다음은 간단한 예제입니다:
let coffeePromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Your coffee is ready!");
}, 2000);
});
coffeePromise.then((message) => {
console.log(message);
});
이 예제에서 coffeePromise
는 커피를 만드는 과정을 시뮬레이션합니다. 2초 후 (불어내는 시간을 시뮬레이션), 메시지로 해결됩니다. then
메서드는 해결된 프롬이스를 처리하는 데 사용됩니다.
Async/Await: 프롬이스를 위한 문법 설탕
async/await
문법은 프롬이스를 더 쉽게 작업할 수 있게 해줍니다. 이 문법을 사용하면 비동기 코드를 동기 코드처럼 보이고 동작하게 작성할 수 있습니다.
async function getCoffee() {
let message = await new Promise((resolve) => {
setTimeout(() => {
resolve("Your coffee is ready!");
}, 2000);
});
console.log(message);
}
getCoffee();
이 코드는 이전 예제와 같은 작업을 수행하지만, 더 읽기 쉽고 이해하기 쉽게 작성되었습니다.
'for await...of' 루프 사용하기
이제 비동기 연산을 이해했으므로, for await...of
루프를 사용하여 반복할 수 있는 방법을 살펴보겠습니다.
기본 문법
for await...of
루프의 기본 문법은 다음과 같습니다:
async function example() {
for await (let value of asyncIterable) {
console.log(value);
}
}
실용적인 예제
커피 주문을 시뮬레이션하는 비동기 함수가 있다고 가정해봅시다:
async function* coffeeOrders() {
yield await Promise.resolve("Espresso");
yield await Promise.resolve("Latte");
yield await Promise.resolve("Cappuccino");
}
async function serveCoffee() {
for await (let coffee of coffeeOrders()) {
console.log(`Serving: ${coffee}`);
}
}
serveCoffee();
이 예제에서 coffeeOrders
는 커피 주문을 생성하는 비동기 생성자 함수입니다. serveCoffee
함수는 for await...of
루프를 사용하여 이 주문을 반복하고 커피를 제공합니다.
실제 사용 사례
비동기 반복은 데이터 스트림을 처리하거나 대량의 데이터를 조각별로 처리할 때 특히 유용합니다.
큰 파일 읽기
아주 큰 파일을 줄별로 읽는 상황을 상상해봅시다:
const fs = require('fs').promises;
async function* readLines(file) {
const fileHandle = await fs.open(file, 'r');
const stream = fileHandle.createReadStream();
let buffer = '';
for await (const chunk of stream) {
buffer += chunk;
let lineEnd;
while ((lineEnd = buffer.indexOf('\n')) !== -1) {
yield buffer.slice(0, lineEnd);
buffer = buffer.slice(lineEnd + 1);
}
}
if (buffer.length > 0) {
yield buffer;
}
await fileHandle.close();
}
async function processFile() {
for await (const line of readLines('largefile.txt')) {
console.log(`Processing line: ${line}`);
}
}
processFile();
이 예제는 비동기 반복을 사용하여 대용량 파일을 줄별로 처리하는 방법을 보여줍니다.
페이지별 API 데이터 가져오기
API에서 페이지별 데이터를 가져오는 또 다른 일반적인 사용 사례는 다음과 같습니다:
async function* fetchPages(url) {
let nextUrl = url;
while (nextUrl) {
const response = await fetch(nextUrl);
const data = await response.json();
yield data.items;
nextUrl = data.next;
}
}
async function processAllPages() {
for await (const page of fetchPages('https://api.example.com/data')) {
for (const item of page) {
console.log(`Processing item: ${item.name}`);
}
}
}
processAllPages();
이 예제는 비동기 반복을 사용하여 API에서 페이지별 데이터를 가져오고 처리하는 방법을 보여줍니다.
결론
비동기 반복은 비동기 데이터 소스를 깨끗하고 직관적으로 처리할 수 있는 강력한 도구입니다. 데이터 스트림이나 대용량 데이터를 조각별로 처리할 때 특히 유용합니다.
비동기 반복을 마스터하려면 연습이 중요합니다. 이 개념들을 자신의 프로젝트에서 실험해보지 마십시오. 얼마 지나지 않아 진정한 자바스크립트 ninja가 될 것입니다!
방법 | 설명 |
---|---|
for await...of |
비동기 반복 가능한 객체를 반복하는 데 사용 |
async function* |
비동기 생성자 함수를 정의 |
yield |
생성자 함수에서 반복할 값을 정의 |
Promise.resolve() |
주어진 값을 해결한 프롬이스를 생성 |
async/await |
프롬이스를 더 직관적으로 처리하는 문법 |
coding을 즐기시고, 비동기 연산이 항상 성공적으로 해결되길 바랍니다!
Credits: Image by storyset