home강의 홈으로
Section 14. 비동기 프로그래밍
Lesson 3. 프로미스의 병렬 진행

여러 프로미스를 병렬 처리하기 위한 Promise의 정적 메서드들

// 다섯 주자들이 동시에 질주 // 데드라인(밀리초) 안에 들어오지 못하면 탈락 let DEADLINE = 1450; function getRunPromise (name) { return new Promise((resolve, reject) => { const time = 1000 + Math.random() * 500; setTimeout(() => { if (time < DEADLINE) { console.log(`🚩 ${name} 도착 - ${(time)/1000}초`); resolve({name, time}); } else { reject((`${name} 시간초과`)); } }, time); }); } console.log( '철수,영희,돌준,정아,길돈' .split(',') .map(getRunPromise) );

1. all - 👉 MDN 문서 보기

  • 프로미스의 배열을 받아 동시에 진행
  • 모두 성공하면 resolve된 값들을 배열로 반환 - then으로 받음
  • 하나라도 실패하면 catch 실행
// 한 명이라도 탈락하면 전체 탈락 Promise.all( '철수,영희,돌준,정아,길돈' .split(',') .map(getRunPromise) ) .then(console.log) .catch(console.error) .finally(() => { console.log('- - 경기 종료 - -'); }); // 성공시 탑3 표시 Promise.all( '철수,영희,돌준,정아,길돈' .split(',') .map(getRunPromise) ) .then(arr => { return arr.sort((a, b) => { return a.time - b.time }) .map(({name}) => name) .splice(0, 3) .join(', '); }) .then(top3 => { console.log(`탑3: ${top3}`); }) .catch(console.error) .finally(() => { console.log('- - 경기 종료 - -'); });

2. allSettled - 👉 MDN 문서 보기

  • 주어진 프로미스들의 결과를 배열로 출력
  • 실패 유무 관계없이 then으로 배열 반환
Promise.allSettled( '철수,영희,돌준,정아,길돈' .split(',') .map(getRunPromise) ) .then(console.log) // ⚠️ catch는 동작하지 않음 .finally(() => { console.log('- - 경기 종료 - -'); }); Promise.allSettled( '철수,영희,돌준,정아,길돈' .split(',') .map(getRunPromise) ) .then(arr => { return { succ: arr.filter(result => { return result.status === 'fulfilled' }), fail: arr.filter(result => { return result.status === 'rejected' }) } }) .then(res => { res.succ.sort((a, b) => { return a.value.time - b.value.time; }); console.log( `완주: ${res.succ.length}명 (1등: ${res.succ[0].value.name})` ); console.log( `탈락: ${res.fail.length}명` ); }) .finally(() => { console.log('- - 경기 종료 - -'); });

3. any - 👉 MDN 문서 보기

  • 가장 먼저 성공한 프로미스의 결과를 then으로 반환
  • 모두 실패시 오류 발생
DEADLINE = 1050; Promise.any( '철수,영희,돌준,정아,길돈' .split(',') .map(getRunPromise) ) .then(console.log) // ⚠️ 모두 실패해도 catch는 동작하지 않음 .finally(() => { console.log('- - 경기 종료 - -'); });

4. race - 👉 MDN 문서 보기

  • 성공이든 실패든 첫 결과물 then 또는 catch로 반환
// 다섯 주자들이 선택한 도착지로 질주 // 도착지에 '꽝'이 있으면(50% 확률) 실패 function getBombRunPromise (name) { return new Promise((resolve, reject) => { const time = 1000 + Math.random() * 500; setTimeout(() => { console.log(`🚩 ${name} 도착 - ${(time)/1000}초`); if (Math.random() < 0.5) { resolve((`🙌 ${name} 승리!`)); } else { reject((`💣 ${name} 꽝!`)); } }, time); }); } Promise.race( '철수,영희,돌준,정아,길돈' .split(',') .map(getBombRunPromise) ) .then(console.log) .catch(console.error) .finally(() => { console.log('- - 경기 종료 - -'); });

🤔얄코에게 질문하기질문은 반.드.시 이리로 보내주세요! ( 강의사이트 질문기능 ✖ )

강의에서 이해가 안 되거나 실습상 문제가 있는 부분,
설명이 잘못되었거나 미흡한 부분을 메일로 알려주세요!

답변드린 뒤 필요할 경우 본 페이지에
관련 내용을 추가/수정하도록 하겠습니다.

이메일 주소
yalco@yalco.kr
메일 제목 (반드시 아래 제목을 붙여넣어주세요!)
[질문] 제대로 파는 자바스크립트 (유료 파트) 14-3

🛑질문 전 필독!!

  • 구글링을 먼저 해 주세요. 들어오는 질문의 절반 이상은 구글에 검색해 보면 1분 이내로 답을 찾을 수 있는 내용들입니다.
  • 오류 메시지가 있을 경우 이를 구글에 복붙해서 검색해보면 대부분 짧은 시간 내 해결방법을 찾을 수 있습니다.
  • 강의 페이지에 추가사항 등 놓친 부분이 없는지 확인해주세요. 자주 들어오는 질문은 페이지에 추가사항으로 업데이트됩니다.
  • "유료파트의 강의페이지는 어디 있나요?" - 각 영상의 시작부분 검은 화면마다 해당 챕터의 강의페이지 링크가 있습니다.
  • 질문을 보내주실 때는 문제가 어떻게 발생했고 어떤 상황인지 등을 구체적으로 적어주세요. 스크린샷을 첨부해주시면 더욱 좋습니다.
🌏 Why not change the world?