ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Javascript - Promise all, Promise.race
    Javascript 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는 가장 먼저 끝난 값 하나만 반환한다.

    가장 먼저 끝난 것이 에러일 때만 에러로 간주 -> 나머지는 상관없음

     

     

    'Javascript' 카테고리의 다른 글

    Javascript - 모달 만들기  (0) 2020.09.06
    Javascript - 카운터 어플리케이션 예제  (0) 2020.09.06
    Javascript - async / await  (0) 2020.09.06
    Javascript - Promise  (0) 2020.09.06
    Javascript - 비동기 처리  (0) 2020.09.06
Designed by Tistory.