Promise 란?

프로미스가 생성된 시점에는 알려지지 않았을 수도 있는 값을 위한 대리자로, 비동기 연산이 종료된 이후에 결과 값과 실패 사유를 처리하기 위한 처리기이다.
프로미스를 사용하면 비동기 메서드에서 동기 메서드처럼 값을 반환할 수 있다.

Promise의 상태

  • 대기(pending): 이행하지도, 거부하지도 않은 초기 상태.
  • 이행(fulfilled): 연산이 성공적으로 완료됨.
  • 거부(rejected): 연산이 실패함.

Promise.all()

순회 가능한 객체에 주어진 모든 프로미스가 이행한 후, 혹은 프로미스가 주어지지 않았을 때 이행하는 Promise를 반환한다.

예시

순회 가능한 객체에 프로미스가 들어가도 되고 프로미스가 들어가도 된다.

const p = Promise.all([1, 2, 3]); // 모든 값이 즉시 이행됨
const p2 = Promise.all([1, 2, 3, Promise.resolve(444)]); // 444 포함, 모든 값이 이행됨
const p3 = Promise.all([1, 2, 3, Promise.reject(555)]); // 555로 거부됨

setTimeout(() => {
  console.log(p);  // fulfilled: [1, 2, 3]
  console.log(p2); // fulfilled: [1, 2, 3, 444]
  console.log(p3); // rejected: 555
});

거부

하나라도 거부하면 Promise.all()은 즉시 거부한다.

var p1 = new Promise((resolve, reject) => {
  setTimeout(() => resolve("하나"), 1000);
});
var p2 = new Promise((resolve, reject) => {
  setTimeout(() => resolve("둘"), 2000);
});
var p3 = new Promise((resolve, reject) => {
  reject(new Error("거부"));
});

Promise.all([p1, p2, p3, p4, p5])
  .then((values) => {
    console.log(values);
  })
  .catch((error) => {
    console.log(error.message);
  });

// "거부"

Promise.allSettled()

주어진 모든 프로미스를 이행하거나 거부한 후에 각 프로미스의 대한 결과를 나타내는 객체 배열을 반환한다.

Promise.all() 과의 차이

Promise.all()을 사용하면 하나라도 거부 당했을 때 즉시 거부되지만
Promise.allSettedl()는 각 프로미스의 실행 결과를 보존하고 모든 프로미스를 실행한다.

예시

각각의 프로미스 결과값을 보존한다.

const p1 = Promise.resolve(1)
const p2 = new Promise((resolve, reject) =>
  setTimeout(reject, 100, 'a'),
);

Promise.allSetted([p1, p2]).then((results) => {
	results.forEach((result) => console.log(result)
})
// "fulfilled"
// "rejected"
  
  
profile
안녕하세요. 프론트엔드 개발 공부를 하고 있습니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN