본문 바로가기

하루정리

2022.09.26 Java Script - async

//async & await 
//에이싱크와 어워잇
//Promis 보다 간편하게 작성이 가능


//1. async : function앞에 붙이면 자동적으로  Promise를 사용한 것 처럼 된다. 
// async function 함수이름(){}

function fetchUser() {
    //서버와 연결하여 유저의 정보를 받아오는 펑션이 있다고 가정
    //di network reqeust in 10 secs....
    return 'moon';
}
const user = fetchUser();
console.log(user);

/*
이렇게 시간이 걸리는 코드를 비동기적 처리를 하지 않으면 
코드가 적힌 순서대로, 동기 방식으로 진행 되기 때문에 
const user = fetchUser(); 가 실행 되면
fetchUser가 선언된 곳으로 가서 10초동안 머무르고 
성공적으로 데이터를 받아오면 'moon'이 return 된다. 

사용자의 데이터를 받아오는데 10초가 걸릴때
만약 뒤에 웹 페이지를 표시하는 function이 있다면
10초 동안 빈 화면이 나오고 유저 정보를 받아오고 나서야
화면이 보일 것이다. 

비동기 처리방법은 Promis로 만드는 것. 

*/

//Promise를 사용한 비동기 함수 만들기
function fetchUser1() {
    return new Promise((resolve, reject) => {
        resolve('moon1');
    });
}

const user1 = fetchUser1();
user1.then(console.log);

//Promise 를 사용하지 않고 더 간단하게 비동기 함수 만들기

async function fetchUser2() {
    return 'moon2'
}

const user2 = fetchUser2();
user2.then(console.log);

//2.await : 기다려, asybc  가 붙은 함수에서만 사용가능 
//정해진 시간이 지나면 resolve 를 호출하는 함수

function delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getApple() {
    await delay(2000);
    return '사과';
}

async function getBanana() {
    await delay(1000);
    return '바나나';
}
//위에 두 getApple와 getBanana는 3초 후에(비동기로) 사과, 바나나를 불러온다.

/* 
바나나와 사과를  Promis로 만들면
function getBanana(){
return delay(3000)
.then(()=>'바나나');
}

function pickFruist() {
    return getApple()                                   //리턴 값으로 getApple를 부르고 
        .then(apple => {                                // apple 가 받아와 지면
            return getBanana()                          //받아온 apple를 이용해서 banana를 받아오고
                .then(banana => `${apple} + ${banana}`) //바나나를 받아오면 strin템플릿을 이용하여
        });                                             //apple와 banana를 동시에 묶어주는 애를 리턴

}
pickFruist().then(console.log);  //결과 값 사과 + 바나나

이것이 바로  coll back지옥이 될 수 있다. 
*/

/*
async function pickFruits(){
    const apple = await getApple();
    const bababa = await getBanan();
    return `${apple} + ${banana}`;
}
//이 경우는 사과와 바나나가 순차적으로 받아오는 상태이다. 
*/

async function pickFruits() {
    const applePromise = getApple();
    const bababaPromise = getBanana();
    const apple = await applePromise;
    const banana = await bababaPromise;
    return `${apple} + ${banana}`;
}
//이 경우에는 사과와 바나나를 동시에 따서 온다
//순차가 아닌 병렬로 실행되는 상태
//하지만 코드가 지저분하기에 다른 기능을 쓴다. 



//3. useful Promise APIs

//Promise.all : Promise 배열을 전달하면 모든 Promise 별렬적으로 다 받을 때 까지 모아준다. 
function pickAllFruits() {
    return Promise.all([getApple(), getBanana()])
        .then(fruits => fruits.join('+')); //join 텍스트를 묶는 배열 API
};

pickAllFruits().then(console.log);
//pickAllFruits가 성공하면(then) console.log를 출력한다. 


//Promise.race :배열에 전달된 Promise중에서 가장 먼저 값을 리턴하는 것만 전달된다. 
function pickOnlyOne(){
    return Promise.race([getApple(), getBanana()])
}
pickOnlyOne().then(console.log)
//getBanana가 1초 이기 때문에 바나나만 출력 된다. 



/**/