Programming/Javascript, Typescript

Promise.all, 무엇이고 언제 사용해야 할까?

리버김 2023. 3. 6.
코드 리뷰 스터디에서 동료분으로부터 Promise.all의 존재를 알게 되었다. 들어본 적은 없었지만 설명해주신 걸 들어보니 복수의 요청을 한 번에 보내고, 프로미스도 전부 합쳐 한 번에 반환하는 핸들러였다. 하나라도 오류가 나면 Promise.all 전체가 거부되고 .catch가 실행된다. 해당 에러가 Promise.all 전체의 결과가 되는 거다.

Promise.all(iterable)

Promise.all() 메서드는 순회 가능한 객체에 주어진 모든 프로미스가 이행(fulfill)한 후, 혹은 프로미스가 주어지지 않았을 때 이행하는 Promise를 반환한다. 주어진 프로미스 중 하나가 거부하는경우, 첫 번째로 거절한 프로미스의 이유를 사용해 자신도 거부한다.(MDN 문서)

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values);
});
// Expected output: Array [3, 42, "foo"]

 

Promise.all 언제 사용해야 할까?

  1. 복수의 비동기 요청 중 하나라도 실패하면 의미가 없을 때: 하나의 요청이 실패하면 전부 reject되는 것이 특징이기 때문에, 이것은 Promise.all을 사용할 수 있는 필요충분조건이다. 코드를 나중에 읽을 때도 "아, 이 요청들이 모두 연관되어 있구나"라는 것을 쉽게 알 수 있다는 장점이 있을 것이다.
  2. 비동기처리를 동시에 해서 빨리 처리하고 싶을 때: Promise.all은 다른 요청들에 대한 응답 여부와 상관 없이 '땅!'하면 복수의 요청을 동시에 보내기 때문에, 병렬적 요청으로 처리 속도를 빨리할 수 있다는 게 큰 장점이다.
  3. 빨리 에러를 띄우고 싶을 때: 만약 여러 개의 비동기 함수 중 하나라도 실패하면 의미가 없는 경우, 모두 동시에 요청을 보내면 빨리 실행되는 친구가 에러를 띄웠을 경우 빨리 에러를 받아볼 수 있다. 가장 빨리 에러를 띄울 법한 함수를 VSCode 맨 위에 작성하면 이와 같은 효과를 볼 수 있겠지만, 개발자가 그 여부를 알기도 힘들거니와 개발하면서 매 번 신경쓰기도 힘들 거다.

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

 

Promise.all() - JavaScript | MDN

Promise.all() 메서드는 순회 가능한 객체에 주어진 모든 프로미스가 이행한 후, 혹은 프로미스가 주어지지 않았을 때 이행하는 Promise를 반환합니다. 주어진 프로미스 중 하나가 거부하는 경우, 첫

developer.mozilla.org

https://ko.javascript.info/promise-api

 

프라미스 API

 

ko.javascript.info

반응형

댓글