반응형
async/await란?
async
와 await
는 JavaScript에서 비동기 작업을 보다 간편하고 직관적으로 작성할 수 있도록 도와주는 구문입니다. async
함수는 항상 프로미스를 반환하며, await
키워드는 프로미스가 해결될 때까지 기다립니다.
async 함수
async
키워드를 함수 앞에 붙이면 해당 함수는 항상 프로미스를 반환합니다. 함수 내부에서 return
한 값은 자동으로 Promise.resolve
로 감싸집니다.
예제
async function fetchData() {
return 'Fetched Data';
}
fetchData().then((data) => {
console.log(data); // 'Fetched Data'
});
await 표현식
await
키워드는 async
함수 내부에서만 사용할 수 있으며, 프로미스가 해결될 때까지 함수의 실행을 일시 중단시킵니다. await
은 프로미스가 이행되면 그 결과 값을 반환하고, 거부되면 에러를 발생시킵니다.
예제
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Fetched Data');
}, 1000);
});
}
async function displayData() {
const data = await fetchData();
console.log(data); // 'Fetched Data' (1초 후 출력)
}
displayData();
async/await와 에러 처리
try...catch
문을 사용하여 async/await
구문에서 발생하는 에러를 처리할 수 있습니다.
예제
function fetchDataWithError() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject('Error fetching data');
}, 1000);
});
}
async function displayData() {
try {
const data = await fetchDataWithError();
console.log(data);
} catch (error) {
console.error(error); // 'Error fetching data' (1초 후 출력)
}
}
displayData();
async/await와 프로미스 체이닝
async/await
을 사용하여 여러 비동기 작업을 순차적으로 처리할 수 있습니다. 이는 프로미스 체이닝을 보다 간결하고 읽기 쉽게 만듭니다.
예제
function step1() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Step 1 complete');
}, 1000);
});
}
function step2() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Step 2 complete');
}, 1000);
});
}
function step3() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Step 3 complete');
}, 1000);
});
}
async function executeSteps() {
const result1 = await step1();
console.log(result1); // 'Step 1 complete'
const result2 = await step2();
console.log(result2); // 'Step 2 complete'
const result3 = await step3();
console.log(result3); // 'Step 3 complete'
}
executeSteps();
async/await와 병렬 처리
Promise.all
과 함께 사용하여 여러 비동기 작업을 병렬로 처리할 수 있습니다.
예제
function fetchData1() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Data 1');
}, 1000);
});
}
function fetchData2() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Data 2');
}, 2000);
});
}
async function displayData() {
const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
console.log(data1); // 'Data 1' (1초 후 출력)
console.log(data2); // 'Data 2' (2초 후 출력)
}
displayData();
async/await의 장점과 단점
장점
- 가독성 향상: 비동기 코드를 동기 코드처럼 작성할 수 있어 가독성이 높아집니다.
- 에러 처리 개선:
try...catch
문을 사용하여 비동기 작업에서 발생하는 에러를 일관성 있게 처리할 수 있습니다. - 프로미스 체이닝 단순화: 복잡한 프로미스 체이닝을 간결하게 작성할 수 있습니다.
단점
- 브라우저 호환성: 오래된 브라우저에서는 지원되지 않을 수 있습니다.
- 디버깅 어려움: 비동기 호출 스택 추적이 어려울 수 있습니다.
결론
async/await
는 비동기 작업을 처리하기 위한 강력한 도구입니다. 이를 사용하면 비동기 코드를 보다 간편하고 직관적으로 작성할 수 있습니다. 이번 글에서는 async
함수, await
표현식, 에러 처리, 프로미스 체이닝, 병렬 처리, 장점과 단점에 대해 배웠습니다. 다음 글에서는 타이머 함수에 대해 알아보겠습니다.
다음 글에서 만나요!
반응형
'JavaScript 문법 시리즈' 카테고리의 다른 글
[JavaScript 문법] 27일차: 이벤트 루프와 태스크 큐 (0) | 2024.08.27 |
---|---|
[JavaScript 문법] 26일차: 타이머 함수 (0) | 2024.08.26 |
[JavaScript 문법] 24일차: 프로미스 고급 (0) | 2024.08.24 |
[JavaScript 문법] 23일차: 프로미스 기초 (0) | 2024.08.23 |
[JavaScript 문법] 22일차: 콜백 함수 (0) | 2024.08.22 |