회고/TIL

2023-05-26 TIL

yhjs1211 2023. 5. 26. 12:57
  • JavaScript

🔸 async / await 

 

function fetchEgg(chicken) {
  return Promise.resolve(`${chicken} => 🥚`);
}

function fryEgg(egg) {
  return Promise.resolve(`${egg} => 🍳`);
}

function getChicken() {
  return Promise.reject(new Error('can not find 🐓'));
}

// Promise
getChicken()
  .catch(() => '🐔')
  .then((chicken) => fetchEgg(chicken))
  .then((egg) => fryEgg(egg))
  .then((meal) => console.log(meal))
  .catch((error) => console.log(error));

 

Promise 의 형태인 이것을 async / await 를 활용해 좀더 깔끔하게 비동기 방식을 활용하려고 바꾸려 해보았다.

 

먼저 첫번째 만난 오류.

/Users/hoonsworld/Desktop/Sparta/Dream/test.js:28
  return Promise.reject(new Error('can not find 🐓'));
                        ^

Error: can not find 🐓
    at getChicken (/Users/hoonsworld/Desktop/Sparta/Dream/test.js:28:25)
    at fryEggFromChicken (/Users/hoonsworld/Desktop/Sparta/Dream/test.js:38:27)
    at Object.<anonymous> (/Users/hoonsworld/Desktop/Sparta/Dream/test.js:45:1)

 

오류메세지는 친절하다. 어디에 왜 오류가 났는지를 알려주니까 (내가 못한거란걸 팩폭.. 컴퓨터는 거짓말을 하지 않는다. 사람이 잘못이지)

 

왜인가 하니, getChicken() 에서 resolve 를 보내는 것이 아닌 reject를 보내주고 있었고, 그래서 당연히 에러가 발생했던 것이다.

닭을 찾을수 없다 나오기에, 그 오류를 잡아서 '🐔' 으로 데이터 값을 할당해주는걸 제대로 확인을 안했었다. 그래서 다시금 코드 변경.

 

async function fryEggFromChicken(){
    const chicken = await getChicken().catch(()=>'🐔');
    const egg = await fetchEgg(chicken);
    const getFryEgg = await fryEgg(egg);

    return `${chicken}=>${egg}=>${getFryEgg}`
}

여기서 2번째 오류.

이 오류는 내가 아직 Promise의 흐름과 비동기식 데이터 흐름을 제대로 이해하지 못하고 있단 증거였다.

Promise는 정상 처리(resolve)가 되었을 경우와 에러 발생(reject)의 경우 처리 방식이 다른데 위 코드를 보게 되면

return에 ${}, ${}, ${} 으로 또 각각의 변수들을 호출해주고있다.

 

애초에 반환되는 데이터들을 이해하고 그게 중첩적으로 쌓이고 있다는걸 인식을 못해서 생긴 문제.

 

즉 마지막 하나 getFryEgg 만을 반환 해주면 정상적으로 처리 되는 문제였다.

 

 

👉 최종 정리

async function fryEggFromChicken(){
    const chicken = await getChicken().catch(()=>'🐔');
    const egg = await fetchEgg(chicken);
    const getFryEgg = await fryEgg(egg);

    return getFryEgg;
}

fryEggFromChicken()
    .then((data)=>console.log(data));

 

출력 데이터

 

🐔 => 🥚 => 🍳

 

👉 Promise의 흐름, async / await 를 이해했으며, 추후 데이터 값들을 어떻게 비동기식으로 처리할지에 대한 고민이 필요할것 같다.