08
25
728x90

// async, await : promise를 좀 더 간결하고 간편하고 동기적으로 실행되는것처럼 보이게 만들어 줌 / 새로운 것이 아닌 기존의 promise위에 좀 더 간편한 api를 제공

// syntactic sugar : 기존의 존재하는것 위에 기존에 존재하는것을 감싸서 좀 더 간편하게 사용할 수 있는 api를 제공하는것 ex) class (프로토타입을 베이스로한 그 위에 살짝 덧붙여진 것)


<!DOCTYPE html>
<html lang = "en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" consent="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <script src="async/async.js"></script>
    </head>
    <body></body>
</html>

1. async

1) pending 상태

//pending상태

function fetchUser()
{
    //resolve와 reject를 호출하지 않고 return을 하게되면 Promise가 pending상태
    return new Promise((resolve,reject) => {
        //do network reqeust in 10 secs...
        return 'ellie';
    })
}

const user = fetchUser();
user.then(console.log);
console.log(user);

출력 결과

2) fufilled 상태

function fetchUser()
{
    //resolve 사용
    return new Promise((resolve,reject) => {
        //do network reqeust in 10 secs...
        resolve('ellie');
    })
}

const user = fetchUser();
user.then(console.log);
console.log(user);

출력 결과

3) async (위의 코드를 async를 사용하여 수정)

async를 함수앞에 사용하면 자동으로 코드블록이 promise를 사용한 것처럼 결과가 나옴

async function fetchUser()
{
    //do network request in 10 secs...
    return 'ellie';
}

const user = fetchUser();
user.then(console.log);
console.log(user);

출력 결과

2. await

1) await는 async가 붙은 함수 안에서만 사용이 가능

function delay(ms)
{
    return new Promise(resolve => setTimeout(resolve,ms)); //정해진 ms가 지나면 resolve를 호출하는 promise를 return
}

async function getApple()
{
    await delay(1000); //1초있다가
    return '🍎';
}

//chaining
/*
function getBanana()
{
    return delay(3000)
    .then(() => '🍌');
}
*/
//위와같이 chaining을 쓰는것보다 아래와 같이 동기적인 코드를 쓰는것처럼 만들면 더 이해가 쉬움
async function getBanana()
{
    await delay(1000); //1초있다가
    return '🍌';
}

코드 실행 : 

1) getApple()과 getBanana()로 인해 getApple : 1초 + getBanana : 1초 = 총 2초뒤에 결과값이 출력됨

//이렇게 작성하게 되면 callback지옥과 비슷한 문제가 발생함
/*
function pickFruits()
{
    return getApple()
    .then(apple =>{
        return getBanana()
        .then(banana => `${apple} + ${banana}`);
    })
}
*/
//위의 코드를 해결하기 위해 아래와 같이 수정

async function pickFruits()
{
    const apple = await getApple();
    const banana = await getBanana();
    return `${apple} + ${banana}`;
}

pickFruits().then(console.log);

출력 결과

2) 코드를 병렬적으로 실행 : 코드를 병렬적으로 실행하지 않으면 사과1초, 바나나1초 총 2초를 기다려야 하는데 병렬적으로 실행할 경우 1초뒤에 사과, 바나나 코드가 같이 실행

async function pickFruits()
{
    const applePromise = getApple(); //apple의 promise를 만들자마자 getApple()의 코드가 실행됨
    const bananaPromise = getBanana(); //banana의 promise를 만들자마자 getBanana()의 코드가 실행됨
    const apple = await applePromise;
    const banana = await bananaPromise;
    return `${apple} + ${banana}`;
}

pickFruits().then(console.log);

출력 결과

3. 유용한 promise

function pickAllFruits()
{
    //Promise.all : promise배열을 전달하면 모든 promise를 병렬적으로 받을 때까지 모아주는 역할
    return Promise.all([getApple(),getBanana()])
    .then(fruits => fruits.join(' + '));
}
pickAllFruits().then(console.log);

function pickOnlyOne()
{
    //Promise.race : 배열로 전달된 promise 중에서 가장먼저 return된 것만 반환
    return Promise.race([getApple(),getBanana()]);
}
pickOnlyOne().then(console.log);

출력 결과

 

728x90
COMMENT