프로미스는 5가지 정적 메서드를 제공합니다.
Promise.resolve / Promise.reject
이미 존재하는 값을 프로미스 객체로 래핑하는 메서드입니다.
const resolved = Promise.resolved(resolve => resolve([1, 2, 3]);
resolved.then(console.log); // [1, 2, 3]
const rejected = Promise.rejected(new Error("에러 발생"));
rejected.catch(console.log); // "에러 발생!"
Promise.all
여러 프로미스들을 병렬적으로 처리할 때 사용하는 메서드입니다.
const req1 = () =>
new Promise((resolve) => setTimeout(() => resolve(1), 3000));
const req2 = () =>
new Promise((resolve) => setTimeout(() => resolve(2), 2000));
const req3 = () =>
new Promise((resolve) => setTimeout(() => resolve(3), 1000));
Promise.all([req1(), req2(), req3()]
.then(console.log) // [1, 2, 3]
.catch(console.error);
이 메서드는 인자로 프로미스를 요소로 갖는 배열 등의 이터러블을 인수로 받습니다. 만약 요소가 프로미스가 아닌 경우 Promise.resolve 메서드로 래핑합니다.그리고 들어온 모든 비동기 요청이 끝나고 난 후 결과를 배열로 저장한 뒤 새로운 프로미스 객체로 반환합니다. 위 예시는 req1이 3초가 걸리므로 3초 후 fulfilled 상태가 될 때까지 기다린 후에 결과가 반환됩니다. 만약 하나라도 rejected 됐다면 즉시 종료되고 에러를 반환합니다.
Promise.race
여러 프로미스들 중 가장 먼저 fulfilled 또는 rejected 상태가 된 프로미스의 처리 결과를 반환하는 새로운 프로미스를 반환합니다.
Promise.race([
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Error 1')), 500)),
new Promise((resolve) => setTimeout(() => resolve(1), 1000))
])
.then(console.log)
.catch(console.error); // Error 1
Promise.allSettled
프로미스를 요소로 갖는 이터러블을 인수로 전달받습니다. 그리고 전달받은 프로미스가 모두 settled 상태(fulfilled 또는 rejected)가 되면 처리 결과를 배열로 반환합니다.
Promise.allSetteld([
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Error 1')), 500)),
new Promise((resolve) => setTimeout(() => resolve(1), 1000))
])
.then(console.log);
/**
* [
* { status: "rejected", reason: Error: Error 1 },
* { status: "fulfilled", value: 1 }
* ]
/*
- 상태가 fulfilled라면 값은 value 프로퍼티에 담깁니다.
- 상태가 rejected라면 에러는 reason 프로퍼티에 담깁니다.