그러므로 여기다가는 내가 추가적으로 공부한, 내가 몰랐었던 비동기 처리 순서 내용들에 대해 작성해 보려 한다
“ fetch든 axios든 비동기 데이터를 가져오는 로직이 있고 , 이걸 사용하려는 모든 함수에 전부 다 async/await 을 사용해야 할까? “
사용하는게 맞다
이렇게 함으로써 비동기 코드의 동기적인 동작을 보장하는 것이기 때문이다
const getData = async () => {
const data = await fetch('https://open.exchangerate-api.com/v6/latest');
let result = await data.json(); // await한번 더 써야 함
return result.rates;
};
**// 비동기로 받은 값을 사용해야 하므로 await을 사용**
const getRate1 = async (): Promise<object> => {
const currency = await getData();
return currency;
};
**// 비동기로 받은 값을 사용해야 하므로 await을 사용**
const getRate2 = async (): Promise<void> => {
const rate: object = await getRate1();
};
getRate2();
예를 들어, 비동기 데이터를 가져오는 a함수가 있을 때
a,b,c,d 모두 다 await을 사용해야 하는 것이다
useEffect(() => {
const getData = async () => {
const fifa = new FIFAData();
const result = await fifa.getUserId(nickNameInput);
setUserInfo(result);
console.log('1');
};
getData();
console.log('2');
}, [isLoggedIn]);
왜 이건 2 → 1 순으로 찍힐까?
그렇다면 getData() 내부에서는 어떻게 될까?
useEffect(() => {
const getData = async () => {
const fifa = new FIFAData();
console.log('1');
const result = await fifa.getUserId(nickNameInput);
console.log('2');
setUserInfo(result);
};
getData();
}, [isLoggedIn]);
await을 기다렸다가
이처럼 async가 getData()는 비동기 함수가 되므로
외부에서는 비동기적으로 실행이 되므로 다른 로직이 먼저 실행되고
그 다음 , 비동기 함수 내부가 실행이 될 때
해당 내부에서는 await이 진행될 때까지 기다리는 것이다
이 2개가 헷갈렸다
그래서 직접 실험을 해보니 아래와 같았다
// (1)
const getDataAndUpdateInfo = async () => {
**// (2) 그래도 여기까진 우선 진행이 됩니다**
const dbInfo = await getDocs(collection(dbService, 'userInfo'));
// (4) 비동기 로직 진행
};
getDataAndUpdateInfo();
// (3) >> 기존에 진행중이던 외부 로직 (다른 useEffect , 다른 함수들 등...)
getDataAndUpdateInfo() 함수는 비동기 처리를 하는 함수이며
실제로 useEffect()든 아니면 다른 함수 안에서 위의 코드 부분이
실행되고 있다고 가정해보자
만약 getDocs라는 비동기 요청을 await과 함께 호출했을 때 ,
getDataAndUpdateInfo() 내부에서의
await로 지정한 비동기 동작들은 순서대로 진행이 되어야 하므로 await이 끝날 때까지 기다리다가 , 완료가 되면 그때 진행 되는 것이 맞다그렇지만 ,
getDataAndUpdateInfo() 함수 외부의 다른 로직들은
기다리지 않는다
즉 ,기존에 진행중이던 다른 외부의 로직들이 있었다면
getDataAndUpdateInfo()가 async가 붙은 비동기 함수이므로
`getDataAndUpdateInfo() 안에 await 전까지 먼저 진행`하다가
await을 만나면 우선나머지 외부의 동작을 우선적으로 먼저 진행하게 되고
그 다음 이벤트 루프에 의해 테스크큐에 있던,
`await 이후 부터` 실행이 되는 것이다