-
14-3. 프로미스(promise)의 병렬 진행JavaScript 2023. 4. 10. 12:56
I. 여러 프로미스를 병렬 처리하기 위한 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
- 프로미스의 배열을 받아 동시에 진행
- 모두 성공하면 resolve 된 값들을 배열로 반환
- 하나라도 실패하면 catch 실행
// 한 명이라도 탈락하면 전체 탈락 Promise.all( '철수,영희,돌준,정아,길돈' .split(',') .map(getRunPromise) ) .then(console.log) .catch(console.error) .finally(() => { console.log('- - 경기 종료 - -'); });
2. allSettled
- 주어진 프로미스들의 결과를 배열로 출력
- 실패 유무 관계없이 then 으로 배열 반환
Promise.allSettled( '철수,영희,돌준,정아,길돈' .split(',') .map(getRunPromise) ) .then(console.log) // ⚠️ catch는 동작하지 않음 .finally(() => { console.log('- - 경기 종료 - -'); });
3. any
- 가장 먼저 성공한 프로미스 결과를 then 으로 반환
- 모두 실패시 오류 발생
DEADLINE = 1050; Promise.any( '철수,영희,돌준,정아,길돈' .split(',') .map(getRunPromise) ) .then(console.log) // ⚠️ 모두 실패해도 catch는 동작하지 않음 .finally(() => { console.log('- - 경기 종료 - -'); });
4. race
- 성공이든 실패든 첫 결과물 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('- - 경기 종료 - -'); });
'JavaScript' 카테고리의 다른 글
14-4. JavaScript async & await 란? (0) 2023.04.10 14-2. JavaScript 프로미스(promise) (0) 2023.04.10 14-1. JavaScript 비동기의 개념과 타임아웃 (0) 2023.04.10 13-2. JavaScript 프로토타입과 상속 (0) 2023.04.10 13-1. JavaScript 프로토타입(prototype)의 개념 (0) 2023.04.09