1.4 Promise.all() VS Promise.allSettled()
Promise.all()
- DB나 API에서 여러 데이터 동시에 가져올때 Promise.all()로 병렬 처리
- 한 번에 한 데이터만 순차 처리 async/await
let p1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("하나"), 1000);
});
let p2 = new Promise((resolve, reject) => {
setTimeout(() => resolve("둘"), 2000);
});
let p3 = new Promise((resolve, reject) => {
setTimeout(() => resolve("셋"), 3000);
});
let p4 = new Promise((resolve, reject) => {
setTimeout(() => resolve("넷"), 4000);
});
let p5 = new Promise((resolve, reject) => {
reject(new Error("거부"));
});
// .catch 사용:
Promise.all([p1, p2, p3, p4, p5])
.then((values) => {
console.log(values);
})
.catch((error) => {
console.log(error.message);
});
// 콘솔 출력값:
// "거부"
promise.all()은 p2 거부시 다른 프로미스가 이행되었든 상관없이 즉시 reject하기때문에 바로 catch 블럭으로 가서 배열로 결과를 받을 수는 없다. 프로미스중에 하나라도 reject되면 즉시 reject하고 다른 프로미스 이행 여부랑 상관 없이 첫 번째 거부 이유 사용해서 거부함
let p1 = new Promise((resolve, reject) => {
setTimeout(() => resolve("p1_지연_이행"), 1000);
});
let p2 = new Promise((resolve, reject) => {
reject(new Error("p2_즉시_거부"));
});
Promise.all([
p1.catch((error) => {
return error;
}),
p2.catch((error) => {
return error;
}),
]).then((values) => {
console.log(values[0]); // "p1_지연_이행"
console.log(values[1]); // "Error: p2_즉시_거부"
});
- catch는 reject를 처리한다 이게 모다? resolve 상태로 바꾼다
- reject 시 값이 없으면 error 객체에는 undefined가 들어간다
- Promise.all은 모든 프로미스가 resolve 상태가 되면 배열을 반환한다
- 지연된 프로미스(p1)도 완료되기 전까지는 배열에 들어가지 않는다.
Promise.allSettled()
const p1 = Promise.resolve(10);
const p2 = new Promise((resolve, reject) => setTimeout(reject, 100, "에러!"));
const p3 = Promise.resolve(30);
Promise.allSettled([p1, p2, p3])
.then(results => {
console.log(results);
});
/* 출력:
[
{ status: "fulfilled", value: 10 },
{ status: "rejected", reason: "에러!" },
{ status: "fulfilled", value: 30 }
]
*/
- 모든 프로미스가 완료될 때까지 기다림
- 각 프로미스가 이행되었는지, 거부되었는지 상태까지 포함해서 결과를 배열로 반환
- 일부 실패해도 전체 결과를 볼 수 있다