Promise 클래스에는 5가지 정적 메서드가 있음
let promise = Promise.all([
new Promise(resolve => setTimeout(() => resolve(1), 3000)), //1
new Promise(resolve => setTimeout(() => resolve(2), 2000)), //2
new Promise(resolve => setTimeout(() => resolve(3), 1000)) //3
]).then(alert); //1,2,3이 반환
let urls = [
'https://api.github.com/users/iliakan',
'https://api.github.com/users/remy',
'https://api.github.com/users/jeresig'
];
let requests = urls.map(el => fetch(el));
Promise.all(requests)
.then(responses => response.forEach(
response => alert(`${response.url} : ${response.status}`)
));
Promise.all([
new Promise((resolve, reject) => {
setTimeout(() => resolve(1), 1000)
}),
2,
3
]).then(alert); // 1, 2, 3
promise.all은 프라미스가 하나라도 거절되면 전체를 거절, 하지만 promise.allSetteled는 모든 프라미스가 처리될 때까지 기다림
반환되는 배열은 다음과 같은 요소를 가지고 있음
{stats: "fulfilled", value: result} : 응답이 성공할 경우
{status: "rejected", reason: error} : 에러가 발생할 경우
let urls = [
'https://api.github.com/users/iliakan',
'https://api.github.com/users/remy',
'https://no-such-url'
];
Promise.allSettled(urls.map(url => fetch(url)))
.then(results => {
results.forEach((result, num) => {
if (result.status == 'fulfilled') {
alert(`${urls[num]} : ${result.value.status}`);
}
if (result.status == 'rejected') {
alert(`${urls[num} : ${results.reason}`)
}
})
})
Promise.race는 Promise.all과 비슷
가장 먼저 처리되는 프라미스의 결과(에러)를 반환
Promise.race([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error('에러 발생!')), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(alert); // 1
호환서을 위해 함수가 프라미스를 반환하도록 해야 할 때 사용할 수 있음
결과값이 ERROR인 거부 상태 프라미스를 생성
let promise = new Promise((resolve, reject) => reject(error));