반응형
Intro
JavaScript Promise는 비동기 작업의 결과를 나타내는 객체입니다.
Promise는 비동기 작업이 완료되었을 때 성공 또는 실패 여부에 따라 콜백 함수를 실행하거나 다른 Promise 객체와 연결하여 체이닝할 수 있습니다. 이를 통해 비동기 작업을 더 효율적이고 가독성 좋게 처리할 수 있습니다.
Promise 구성요소
- Pending(대기): 비동기 작업이 아직 완료되지 않은 상태입니다.
- Fulfilled(이행): 비동기 작업이 성공적으로 완료되었습니다.
- Rejected(거부): 비동기 작업이 실패하였습니다.
Promise 생성하기
const myPromise = new Promise((resolve, reject) => {
// 비동기 작업 수행
// 작업이 성공하면 resolve(value) 호출하여 결과 전달
// 작업이 실패하면 reject(error) 호출하여 에러 전달
});
Promise 체이닝
- Promise 체이닝을 통해 작업의 흐름을 관리할 수 있으며, 비동기 작업이 완료되면 다음 작업으로 넘어갈 수 있습니다.
myPromise
.then((result) => {
// 성공 콜백
console.log("작업 성공:", result);
return someOtherPromise; // 다른 Promise 객체 반환하여 체이닝 가능
})
.catch((error) => {
// 실패 콜백
console.log("작업 실패:", error);
})
.finally(() => {
// 성공 또는 실패 후 항상 실행되는 콜백
console.log("작업 완료");
});
1) 순차적인 Promise 체이닝
function getUserData(userId) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (userId === 1) {
resolve({ id: 1, name: "John Doe" });
} else {
reject("사용자를 찾을 수 없습니다.");
}
}, 1000);
});
}
function getUserPosts(user) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (user.id === 1) {
resolve(["Post 1", "Post 2", "Post 3"]);
} else {
reject("게시물을 찾을 수 없습니다.");
}
}, 1000);
});
}
getUserData(1)
.then((user) => {
console.log("사용자 정보:", user);
return getUserPosts(user);
})
.then((posts) => {
console.log("게시물 목록:", posts);
})
.catch((error) => {
console.log("오류 발생:", error);
})
.finally(() => {
console.log("작업 완료");
});
위 예시에서 getUserData 함수는 사용자 정보를 비동기적으로 가져오는 Promise를 반환합니다.
그 다음 getUserPosts 함수는 사용자 정보를 받아 해당 사용자의 게시물 목록을 가져오는 Promise를 반환합니다.
이 두 개의 비동기 작업을 순차적으로 처리하기 위해 Promise 체이닝을 사용합니다.
2) 병렬로 처리하는 Promise.all
const promise1 = fetchDataFromServer1();
const promise2 = fetchDataFromServer2();
const promise3 = fetchDataFromServer3();
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log("모든 작업 완료:", results);
})
.catch((error) => {
console.log("오류 발생:", error);
})
.finally(() => {
console.log("작업 완료");
});
위 예시에서 Promise.all 메서드는 여러 개의 Promise 객체를 배열로 받아서 병렬로 처리합니다.
모든 Promise가 성공적으로 완료되면 then 콜백이 실행되고, 그렇지 않으면 catch 콜백이 실행됩니다.
Promise 예시
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const data = { id: 1, name: "John Doe" };
// 비동기 작업 완료 후 resolve 호출하여 결과 전달
resolve(data);
// 비동기 작업 실패 시 reject 호출하여 에러 전달
// reject("데이터를 불러오는 데 실패했습니다.");
}, 2000);
});
}
fetchData()
.then((result) => {
console.log("데이터 불러오기 성공:", result);
})
.catch((error) => {
console.log("데이터 불러오기 실패:", error);
})
.finally(() => {
console.log("작업 완료");
});
위 예시에서 fetchData 함수는 2초 후에 비동기 작업을 완료하고 Promise를 반환합니다.
그 후에는 then 메서드를 사용하여 성공 시의 콜백 함수를 등록하고, catch 메서드를 사용하여 실패 시의 콜백 함수를 등록합니다.
마지막으로 finally 메서드를 사용하여 작업 완료 후 항상 실행되는 콜백 함수를 등록할 수 있습니다.
반응형
'Language > Javascript' 카테고리의 다른 글
[Javascript] 자바스크립트의 즉시실행 함수와 익명 함수(예시 포함) (1) | 2023.05.25 |
---|---|
[Javascript] 자바스크립트(js) Cookie(쿠키) 사용법 (0) | 2023.05.10 |
[JavaScript/jQuery] console과 객체의 주의점 (0) | 2023.02.23 |
[JavaScript/jQuery] Null 병합 연산자 '??' (0) | 2023.01.05 |
[JavaScript/jQuery] checkbox 선택자, 체크 여부 제어 (0) | 2022.08.11 |