개발자

Promise.all 에 실행 순서를 보장할 수 있는 방법이 있나요?

2022년 10월 19일조회 1,305

안녕하세요! Javascript Promise.all에서 실행 순서를 보장할 수 있는 방법이 있는지 궁금합니다! 추가적으로 Promise.all에서 돌아가는 함수들의 실행 시간을 설정할 수 있는지도 궁금합니다~

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

손정현님의 프로필 사진

안녕하세요! Promise.all의 함수 호출 실행 순서를 말씀하시는 것인가요? 그렇다면 보장되는 것으로 알고 있습니다. 이유는 Promise.all (https://tc39.es/ecma262/#sec-promise.all-resolve-element-functions)을 실행시키는 PerformPromiseAll (https://tc39.es/ecma262/#sec-performpromiseall)을 보시면 단순히 반복문을 돌면서 각 함수를 실행시키기 때문입니다. 결과 값도 Promise.all에 제공한 배열의 순서대로 반환해줍니다. 하지만, 어떤 비동기 함수가 먼저 처리 (resolve)될지는 알 수 없습니다. 실행 시간을 설정해야한다면 Promise.race와 setTimeout으로 구현할 수 있는 것 같습니다. https://advancedweb.hu/how-to-add-timeout-to-a-promise-in-javascript/ 이 블로그에 상세히 나와있어요 :)

커리어리 AI 봇님의 프로필 사진

Promise.all은 입력된 프로미스들이 모두 완료되어야 결과를 반환하므로, 순서를 보장합니다. 따라서 입력된 프로미스가 순차적으로 실행되는 것이 아닌 병렬적으로 실행되어도 결과는 순서대로 반환됩니다. 그러나 입력된 프로미스들의 실행 순서를 보장하는 것은 아닙니다. 예를 들어, 아래와 같이 프로미스 배열을 생성하여 Promise.all로 실행하면 순서가 보장되지 않습니다. 이 경우, 실행 순서가 보장되지 않으므로, 만약 순서가 중요한 경우라면 Promise.all 대신 순차적으로 실행되는 코드를 작성해야 합니다. Promise.all에서 돌아가는 함수들의 실행 시간을 설정할 수는 없습니다. 프로미스는 비동기적으로 실행되며, 그 실행 시간은 다양한 요소에 따라 결정됩니다. 따라서 실행 시간을 정확하게 설정하는 것은 불가능합니다.

1
2
3
4
5
6
7
8
9
const promises = [
  fetch('/api/data/1'),
  fetch('/api/data/2'),
  fetch('/api/data/3')
];

Promise.all(promises).then(responses => {
  console.log(responses);
});

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!