Promise.all
여러 프라미스가 모두 이행될 때까지 기다린 후, 각 프라미스의 결과를 배열로 반환합니다.
단, 전달된 프라미스 중 하나라도 거부되면 전체 프라미스가 거부됩니다.
// 각각 다른 시간에 이행되는 프라미스들
const p1 = new Promise(resolve => setTimeout(() => resolve("Data A"), 3000));
const p2 = new Promise(resolve => setTimeout(() => resolve("Data B"), 2000));
const p3 = new Promise(resolve => setTimeout(() => resolve("Data C"), 1000));
// 실패하는 프라미스
const p4 = new Promise((resolve, reject) =>
setTimeout(() => reject(new Error("Failed to fetch Data D")), 1000)
);
// p4를 포함하면 거부되기 때문에 전체 프라미스가 catch 영역으로 갑니다.
Promise.all([p1, p2, p3])
.then(results => {
console.log("모든 데이터 수신:", results); // ["Data A", "Data B", "Data C"]
// 결과 배열의 순서는 Promise.all에 전달한 순서대로입니다.
})
.catch(error => {
console.error("하나 이상의 요청이 실패했습니다:", error);
});
Promise.allSettled
전달된 프라미스들이 모두 처리될 때까지 기다린 후, 각 프라미스의 결과 상태와 값을 객체로 반환합니다.
하나라도 거부되더라도 전체 결과를 확인할 수 있습니다.
const apiCalls = [
new Promise(resolve => setTimeout(() => resolve("Result 1"), 1500)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error("Fail 2")), 1000)),
42 // 프라미스가 아닌 값은 그대로 이행 상태로 처리됩니다.
];
Promise.allSettled(apiCalls)
.then(results => {
results.forEach((result, index) => {
if (result.status === "fulfilled") {
console.log(`API ${index + 1} 성공:`, result.value);
} else {
console.error(`API ${index + 1} 실패:`, result.reason);
}
});
});
Promise.race
전달된 프라미스들 중 가장 먼저 처리(이행 또는 거부)되는 프라미스의 결과를 반환합니다.
const fast = new Promise(resolve => setTimeout(() => resolve("Fast response"), 500));
const slow = new Promise(resolve => setTimeout(() => resolve("Slow response"), 2000));
const errorPromise = new Promise((resolve, reject) =>
setTimeout(() => reject(new Error("Error response")), 1000)
);
Promise.race([slow, errorPromise, fast])
.then(result => {
console.log("최초 응답:", result); // "Fast response"가 출력됩니다.
})
.catch(error => {
console.error("최초 응답 에러:", error.message);
});
Promise.resolve
주어진 값을 이행 상태의 프라미스로 감싸 반환합니다.
이미 프라미스인 경우 그대로 반환하므로, 항상 프라미스 형태의 결과를 보장합니다.
const cache = new Map();
function getCachedData(key) {
if (cache.has(key)) {
// 이미 저장된 값은 즉시 이행된 프라미스로 반환
return Promise.resolve(cache.get(key));
}
// 실제 비동기 작업 예시: 네트워크 요청 (여기선 setTimeout 사용)
return new Promise(resolve => {
setTimeout(() => {
const data = `Fetched data for ${key}`;
cache.set(key, data);
resolve(data);
}, 1500);
});
}
getCachedData("user:123")
.then(data => console.log("첫 호출:", data))
.then(() => getCachedData("user:123"))
.then(data => console.log("캐시 호출:", data));
Promise.reject
주어진 에러(또는 값)를 거부 상태의 프라미스로 감싸 반환합니다.
function validateNumber(n) {
if (typeof n !== "number") {
return Promise.reject(new TypeError("숫자만 허용됩니다."));
}
return Promise.resolve(n);
}
validateNumber("abc")
.then(n => console.log("숫자:", n))
.catch(err => console.error("검증 에러:", err.message));
'JavaScript' 카테고리의 다른 글
[JavaScript] 마이크로태스트 큐 (0) | 2025.02.18 |
---|---|
[JavaScript] 콜백 기반 비동기 프라미스화 (0) | 2025.02.18 |
[JavaScript] 프라미스 체이닝의 에러 처리 (0) | 2025.02.18 |
[JavaScript] 프라미스 체이닝 (0) | 2025.02.18 |
[JavaScript] Promise를 활용한 비동기 작업 (0) | 2025.02.18 |