useEffect로 입력한 함수는 promise를 반환해서는 안 된다.
왜냐하면 useEffect에 입력한 함수는 실행 가능한 cleanup 함수를 반환할 수 있기 때문이다.
그런데 cleanup 함수는 동시에 실행해야 한다. 즉, promise나 이런 것은 반환하지 않고
따라서 useEffect에 입력한 이 전체 함수는 async 함수로 변경해서는 안 된다.
useEffect 대신 async/await를 사용하고 싶다면 fetchMeals와 같은 새 함수를 이렇게 만들면 된다.
그리고 async를 이곳에 사용하여 이 코드 줄을 중첩된 내부 함수로 입력한다. 그 다음 fetchMeal을 useEffect의 일부로 실행하면 된다
useEffect(() => {
const fetchMeals = async () => {
setIsLoading(true);
const response = await fetch("https://react-http-e4fe2-default-rtdb.asia-southeast1.firebasedatabase.app1/meals.json");
if(!response.ok){
throw new Error("Something went wrong!");
}
const responseData = await response.json();
const loadedMeals = [];
for (const key in responseData) {
loadedMeals.push({
id: key,
name: responseData[key].name,
description: responseData[key].description,
price: responseData[key].price
});
}
setMeals(loadedMeals);
setIsLoading(false);
};
try{ <= 여기서부터
fetchMeals();
} catch(err) {
setIsLoading(false);
setHttpError(err.message);
} <= 여기까지
}, [])
if (isLoading) {
return <section className={classes.mealsLoading}>
<p>Loading...</p>
</section>
}
if (httpError) {
return <section className={classes.mealsError}>
<p>{httpError}</p>
</section>
}
fetchMeals().then().catch((err)=>{
setIsLoading(false);
setHttpError(err.message);
});
즉, try-catch를 따로 구현하는 것이 아닌 그냥
fetchMeal
함수에 그냥 .then을 씌워서 async화 해주고 .catch 메서드로 처리하면 된다.