자바스크립트 Promise.allSettled() 이해하기 본문
반응형
Promise.allSettled(iterable);
Promise.allSettled()
메서드는 주어진 모든 프로미스를 이행하거나 거부한 후, 각 프로미스에 대한 결과를 나타내는 객체 배열을 반환합니다.- 일반적으로 서로의 성공 여부에 관련 없는 여러 비동기 작업을 수행해야 하거나, 항상 각 프로미스의 실행 결과를 알고 싶을 때 사용합니다.
- 반환된 각 객체별로
status
를 확인할 수 있습니다. 만약fulfilled
상태라면value
를,rejected
상태라면reason
속성을 확인할 수 있습니다. value나 reason을 통해 각 Promise가 어떻게 이행(또는 거부)됐는지 알 수 있습니다.
예시
Promise.allSettled([
Promise.resolve(33),
new Promise(resolve => setTimeout(() => resolve(66), 0)),
99, // 일반값도 all메서드와 같이 resolve로 감싸집니다.
Promise.reject(new Error('an error'))
])
.then(values => console.log(values));
// [
// {status: "fulfilled", value: 33},
// {status: "fulfilled", value: 66},
// {status: "fulfilled", value: 99},
// {status: "rejected", reason: Error: an error}
//
실제코드 예시
/*
fetch를 사용해 여러 정보를 가져오고 있다고 해봅시다.
여러 요청 중 하나가 실패해도 다른 요청 결과는 여전히 필요합니다.
이럴 때 Promise.allSettled를 사용할 수 있습니다.
*/
let order = [
'https://jsonplaceholder.typicode.com/todos/1',
'https://jsonplaceholder.typicode.com/todos/2',
'https://jsonplaceholder.typicode.com/todos/error' // 실패
];
Promise.allSettled(order.map((url) => fetch(url))) // order에 있는 url fetch
.then((results) => {
results.forEach((result, index) => {
console.log(`${index + 1}번째 프라미즈 상태 코드 : `, result.status)
}
);
return results;
})
.then((results) => {
results.forEach((result, index) => {
if (result.value.status == '200') {
// 성공일 때
console.log(`(res)${order[index]}: ${result.value.status}`);
result.value.json().then(data => {
console.log("Data is : ", data)
})
} else if (result.value.status == '404') {
// 잘못된 url 일 때
console.log(`(rej)${order[index]}: ${result.statusText}`);
}
});
})
.catch((results) => {
console.log('in catch block : ', results)
return results
})
.finally(() =>
console.log('Promise.allSettled 완료')
}
- jsonplaceholder의 url을 fetch할 경우 없는 url이라도 상태코드에서 404를 주지 요청이 실패하는건 아닌 것 같습니다.
- 따라서 전부다 fullfilled로 들어오기때문에 allSettled된 값을 보고 에러처리를 해줬습니다.
- 원래는 이행, 거절 상태에 따라 fullfilled, rejected 로 구분하여 처리를 해줄 수 있습니다.
반응형
'JavaScript' 카테고리의 다른 글
JS function vs arrow function (4) | 2023.05.31 |
---|---|
Javascript - this 키워드 (0) | 2023.05.30 |
자바스크립트 async / await 이해하기 (0) | 2023.05.24 |
자바스크립트 Promise.all() 이해하기 (0) | 2023.04.25 |
자바스크립트 프라미스 (Promise) 이해하기 (0) | 2023.04.25 |
Comments