콜백 함수
가 있다. 콜백 함수
란, 함수의 인자로 전달되는 함수로 특정 작업이 완료된 후 호출된다. 즉, 함수의 비동기 작업이 완료된 후 콜백 함수가 실행되어 비동기 작업의 결과를 처리한다.Promise
는 '약속'이란 의미처럼, 비동기 작업의 진행 상태를 관리하는 "객체 "이다. Promise
는 비동기 작업의 상태를 관리하고, 체이닝을 통한 비동기 작업 처리를 하기 때문에, 콜백 함수의 단점을 보완한다.
Promise()
생성자resolve
와 reject
를 받아, 성공 혹은 실패에 대한 로직을 수행한다.const 이름 = new Promise((resolve, reject) => {콜백 함수 로직})
//예시
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("비동기로 처리해봅시다");
}, 3000);
});
pending
: 대기, 비동기 처리 로직이 아직 완료되지 않은 상태fulfilled
: 이행, 비동기 처리가 완료되어 프로미스가 결과 값을 반환해준 상태rejected
: 실패, 비동기 처리가 실패하거나 오류가 발생한 상태Promise는 후속 처리 메소드를 체이닝(chaining)하여 여러 Promise를 연결한다. 이를 통해 콜백 지옥을 해결한다.
then()
: Promise가 이행(fulfilled) 되었을 때 실행되는 로직. 이전 Promise의 결과를 받아 새로운 값을 반환하거나, 새로운 Promise를 반환할 수 있다.catch()
: Promise가 실패(rejected) 되었을 때 실행되는 로직. 이전 then()에서 발생한 오류를 잡아 처리할 수 있다.finally()
: Promise의 성공/실패 여부와 관계없이 무조건 실행되는 로직fetch("https://jsonplaceholder.typicode.com/users/1")
.then((response) => response.json()) // ✅응답을 JSON으로 변환
.then((data) => console.log("사용자 데이터:", data)) // ✅JSON 데이터 출력
.catch((error) => console.error("오류 발생:", error)) // ❌오류 처리
.finally(() => console.log("요청 완료!")); // ❓성공/실패와 관계없이 실행
Promise.all()
은 여러 개의 Promise들을 병렬적으로 실행하여 처리하는 메서드로, 다음 로직을 계속 실행하기 전에 서로 연관된 비동기 작업 여러 개가 모두 이행되어야할 때 사용한다. 즉, 내부 Promise들은 실행 순서와 상관없이 각각 진행되지만, Promise.all()
은 모든 Promise가 완료될 때까지 기다린다.
인자로 여러 Promise를 담은 배열을 받으며, 인자로 들어온 Promise 중 하나라도 rejected가 되면 Promise.all()
은 즉시 거부된다.
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "foo");
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// [3, 42, "foo"]
async/await란?
async/await
는 JavaScript 비동기 처리 문법 중 가장 최근에 나온 문법으로, 기존 콜백 함수와 Promise의 단점을 보완하고, 개발자 친화적인 문법을 제공한다.
async
async
는 함수(function) 앞에 사용하는 키워드로, async
함수는 항상 Promise를 반환한다. 즉, 해당 함수의 return 값이 Promise가 아니어도 Promise로 감싸진 값이 반환된다.
await
await
는 async 함수
안에서만 동작하며, Promise가 처리될 때까지 함수 실행을 기다리게 하는 키워드이다. await
가 붙은 Promise가 처리되면 그 결과값과 함께 다음 로직이 실행된다.
기존 Promise의 then
과 catch
를 체이닝하여 사용하는 문법보다 await
를 사용한 문법이 가독성이 좋다.
try...catch
try...catch
는 await
가 던진 에러를 잡는 문법이다. async/await
를 사용하면 await
가 대기를 처리해주기 때문에 then
이 필요하지 않고, catch
대신 try..catch
를 사용할 수 있다.
사용 방법
async function 함수명() {
await 비동기_처리_메서드_명();
};
//예시
async function fetchData () {
const response = await fetch("https://jsonplaceholder.typicode.com/")
const data = await response.json()
return data
}
async/await
는 Promise 체이닝보다 가독성이 좋지만, Promise.all()
처럼 병렬적으로 처리해야 하는 경우에는 await를 연속으로 사용하면 오히려 성능이 저하될 수 있다.// 병렬 실행이 아님 (비효율적)
async function fetchUsers() {
const user = await fetch("/user");
const posts = await fetch("/posts");
return { user, posts };
}
// Promise.all()을 사용하여 병렬 실행 (더 효율적)
async function fetchUsersParallel() {
const [user, posts] = await Promise.all([
fetch("/user"),
fetch("/posts")
]);
return { user, posts };
}
동기/비동기 참고 사이트 1
동기/비동기 참고 사이트 2
Promise 참고 사이트 1
Promise 참고 사이트 2
async/await 참고 사이트 1