Promise와 Async
- 자바스크립트에서 비동기 처리를 다루기 위한 두 가지 주요 패턴인 'Promise'와 'async/await'는 각각 고유한 특징과 사용 방법을 가지고 있다.
- 이 두 패턴은 비동기 작업을 더 쉽게 관리할 수 있도록 도와주지만, 사용 방식과 코드의 가독성 측면에서 차이가 있다.
Promise
- 'Promise'는 비동기 작업의 완료 또는 실패를 처리하기 위한 객체이다.
- 'Promise'는 비동기 작업이 완료된 후의 결과를 약속(promise)하고, 그 결과에 따라 'then' 또는 'catch' 메서드를 통해 처리할 수 있다.
// Promise를 사용하는 예제
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Data received");
}, 1000);
});
}
fetchData().then(data => {
console.log(data); // "Data received"
}).catch(error => {
console.error(error);
});
async/await
- 'async' 함수는 항상 'Promise'를 반환한다.
- 'await' 키워드는 'async' 함수 내부에서만 사용할 수 있으며, 'Promise'가 해결될 때까지 실행을 일시 중지한다.
- 'await'을 사용하면 비동기 코드를 동기 코드처럼 작성할 수 있어 가독성이 높아진다.
// async/await를 사용하는 예제
async function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Data received");
}, 1000);
});
}
async function main() {
try {
const data = await fetchData();
console.log(data); // "Data received"
} catch (error) {
console.error(error);
}
}
main();
주요 차이점
- 코드 가독성
- Promise
- 'then'과 'catch'를 체이닝 하여 사용하며, 복잡한 비동기 작업에서는 가독성이 떨어질 수 있다.
- async/await
- 비동기 코드를 동기 코드처럼 작성할 수 있어 가독성이 높아진다.
- 특히 여러 비동기 작업을 순차적으로 수행할 때 코드가 더 명확해진다.
- Promise
- 에러 처리
- Promise
- 'catch' 메서드를 사용하여 에러를 처리한다.
- async/await
- 'try/catch' 블록을 사용하여 에러를 처리할 수 있어, 동기 코드와 비슷한 방식으로 예외 처리를 할 수 있다.
- Promise
- 동작 방식
- Promise
- 'Promise' 객체를 반환하고, 'then'과 'catch'를 사용하여 비동기 작업의 완료 또는 실패를 처리한다.
- async/await
- 'async' 함수는 항상 'Promise'를 반환하며, 'await' 키워드는 'Promise'가 해결될 때까지 실행을 일시 중지시킨다.
- 이는 비동기 작업을 더 직관적으로 작성할 수 있게 한다.
- Promise
- 병렬 처리
- Promise
- 여러 'Promise'를 'Promise.all'이나 'Promise.race'와 함께 사용하여 병렬 처리를 할 수 있다.
- async/await
- 'await'을 반복문에서 사용하면 비효율적일 수 있으므로, 병렬 처리가 필요할 때는 'Promise.all'과 함께 사용한다.
- Promise
// Promise.all을 사용한 병렬 처리
async function fetchData1() {
return new Promise(resolve => setTimeout(() => resolve("Data 1"), 1000));
}
async function fetchData2() {
return new Promise(resolve => setTimeout(() => resolve("Data 2"), 1000));
}
async function main() {
const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
console.log(data1, data2) // "Data 1", "Data 2"
}
main();
요약
- 'Promise'와 'async/await'는 모두 비동기 작업을 처리하기 위한 패턴이다.
- 'Promise'는 'then'과 'catch'를 사용하여 비동기 작업의 결과를 처리한다.
- 'async/await'는 비동기 코드를 동기 코드처럼 작성할 수 있도록 도와주며, 가독성이 높아진다.
- 에러 처리는 'Promise'에서는 'catch'로, 'async/await'에서는 'try/catch' 블록으로 할 수 있다.
- 병렬 처리는 'Promise.all'을 사용하여 효율적으로 처리할 수 있다.
'코드 > JavaScript' 카테고리의 다른 글
실행컨텍스트와 호이스팅 (0) | 2024.10.15 |
---|---|
RESTful API란? (0) | 2024.06.20 |
화살표 함수와 일반 함수의 차이점 (0) | 2024.06.19 |
호이스팅과 스코프 (0) | 2024.06.19 |
let, var, const 기초 (0) | 2024.06.18 |