Javascript
Javascript - Promise all, Promise.race
Starters
2020. 9. 6. 16:57
Promise.all
function sleep(ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
const getDog = async () => {
await sleep(1000);
return '멍멍이';
}
const getRabbit = async () => {
await sleep(500);
return '토끼';
}
const getTurtle = async () => {
await sleep(3000);
return '거북이';
}
async function process(){
const dog = await getDog();
console.log(dog);
const rabbit = await getRabbit();
console.log(dog);
const turtle = await getTurtle();
console.log(turtle);
}
process();
이렇게 하면 process 함수 안에서 하나씩 함수 호출한다.
Promise All 사용하면 한번에 호출할 수 있음
function sleep(ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
const getDog = async () => {
await sleep(1000);
return '멍멍이';
}
const getRabbit = async () => {
await sleep(500);
return '토끼';
}
const getTurtle = async () => {
await sleep(3000);
return '거북이';
}
async function process(){
const results = await Promise.all([getDog(), getRabbit(), getTurtle()]);
console.log(results);
}
process();
이렇게 만들면 배열안의 모든 함수가 다 끝날 대 Promise함수가 끝나게 되고
getTurtle() 이 3초가 걸리기 때문에 실제 걸린 시간은 3초이다
결과값은 ['멍멍이', '토끼', '거북이']
각 Promise.all 의 배열안의 값들을 꺼내주고 싶을 때
function sleep(ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
const getDog = async () => {
await sleep(1000);
return '멍멍이';
}
const getRabbit = async () => {
await sleep(500);
return '토끼';
}
const getTurtle = async () => {
await sleep(3000);
return '거북이';
}
async function process(){
// const results = await Promise.all([getDog(), getRabbit(), getTurtle()]);
// const dog = results[0]; // 가장 기본적인 방식
// 배열 비구조 할당을 하면 더욱 깔끔함
const [dog, rabbitm turtle] = await Promise.all([getDog(), getRabbit(), getTurtle()]);
console.log(dog);
console.log(rabbit);
console.log(turtle);
}
process();
Promise.all은 배열안의 하나라도 에러 발생하면 전체 Promise가 에러 발생한 것으로 간주
Promise.race
function sleep(ms){
return new Promise(resolve => setTimeout(resolve, ms));
}
const getDog = async () => {
await sleep(1000);
return '멍멍이';
}
const getRabbit = async () => {
await sleep(500);
return '토끼';
}
const getTurtle = async () => {
await sleep(3000);
return '거북이';
}
async function process(){
const first = await Promise.race([getDog(), getRabbit(), getTurtle()]);
console.log(dog);
console.log(rabbit);
console.log(turtle);
}
process();
Promise.race는 가장 먼저 끝난 값 하나만 반환한다.
가장 먼저 끝난 것이 에러일 때만 에러로 간주 -> 나머지는 상관없음