개발공작소
article thumbnail
728x90
반응형

 

 

Promise.all 이란?

 

여러 개의 프라미스를 동시(병렬)에 실행시키고 모든 프라미스가 준비될 때까지 기다린다고 해봅시다.

복수의 URL에 동시에 요청을 보내고, 다운로드가 모두 완료된 후에 콘텐츠를 처리할 때 이런 상황이 발생합니다.

Promise.all은 이럴 때 사용할 수 있습니다. -javascript.info/promise-api-

 

쉽게 말해 여러개의 프라미스를 수행하고 모든 프라미스가 수행될 때까지 기다린 후에

다음 프로세스를 진행시킨다고 보면 된다.

 

 

 

Promise.all 사용방법

 

 

기본문법

let promise = Promise.all([...promises...]);

 

 

샘플

Promise.all([
  new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
  new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
  new Promise(resolve => setTimeout(() => resolve(3), 1000))  // 3
]).then(alert);

//1,2,3 순서대로 팝업창이 뜸

 

 

위의 기본문법과 샘플은 javascript.info에서 제공하는 코드이다. 테스트 해보면 3개의 프라미스 객체가 있고

3개의 프라미스가 전부 완료되야 Alert 팝업창이 뜬다.

 

 

샘플2

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body></body>
<script>    
    /**
     * 샘플 코드를 수행하는 sampleFun 작성 
     */
    async function sampleFun() {

        //number 배열을 받아 샘플 REST API URL 생성 및 비동기 통신 수행
        const callApi = async (number) => {

            url = 'https://jsonplaceholder.typicode.com/todos/' + number;

            return await fetch(url)
            .then(response => response.json())
            .then(json => {return json});

        }    
        
        //비동기 통신을 수행 할 횟수를 담ㅇ므
        var numbers = [1,2,3,4,5,6];
        
        //numbers 배열의 길이만큼 callApi호출
        var arr = numbers.map(async (e) =>{
            console.log(e + ' 수행')
            return await callApi(e);
        });    
        
        //모든 비동기 통신이 끝난후에 리턴 되는 값을 resultList에 담음
        var resultList = await Promise.all(arr);    
        
        //결과값을 콘솔에 찍음
        resultList.map(e=>{
            console.log(e);
        })
        
        //await 대신 then으로 체인을 걸어도 됨
        /*Promise.all(arr).then(result =>{
            resultList = result;
            console.log(resultList);
        });*/
    }

    //sampleFun호출
    sampleFun();

</script>

</html>

 

 

위에는 그냥 샘플로 짜본 코드이다. 대충 로직을 보면 이렇다.

 

1. 수행하고자 하는 비동기 통신의 횟수를 numbers 배열에 담는다.

2. numbers의 길이만큼 callApi를 호출하는 arr이라는 프라미스 배열을 만든다.

3. Promise.all에 arr 프라미스 배열을 파라메터로 준다.

4. 모든 비동기 통신이 끝난 후 resultList에 리턴값을 담는다.

5. 콘솔에 찍는다.

 

여기서 arr이라는 배열이 중요한데, Promise.all()의 파라메터로 사용하려면 프라미스 배열 형태가 필요하다.

이때 async는 리턴할 때, 리턴되는 값이 무엇이든 프라미스 객체 형태로 리턴하기 때문

arr은 프라미스 배열 형태로 작성된다.

 

이렇게 결과를 보면 모든 비동기통신이 끝난후에 resultList가 제대로 찍히는 것을 확인 할 수 있다.

아래는 결과화면

 

 

 

 

 

내 생각에는 Promise.all을 사용할때는 주로 다수의 비동기통신을 해야하는 상황에서 동기처리를 위해 모든 작업이

끝난 후 결과값을 담을 때 사용하면 될 것 같다.

 

 

728x90
반응형
profile

개발공작소

@모찌바라기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!