API를 분리하여 QuizPage에서 가져다가 쓰고 있는 상태이다. 하지만 이런 의문점이 든다. API분리 시점에서 이미 async/await을 처리해줬는데 굳이 또 QuizPage안에 있는 handleClickOnBtn 함수 안에서 다시 async/await 처리를 해줘야하나 ? 라는 의문점이 들었다.
import { api } from '../api';
export const postAnswer = async (corretIc: boolean) => {
try {
const quizId = sessionStorage.getItem('quizId');
const userId = !sessionStorage.getItem('userId')
? 1
: sessionStorage.getItem('userId');
const { data } = await api.post(`/api/v1/quiz/${quizId}/solve/${userId}`, {
answer: corretIc ? 1 : 0,
});
// correctIC 나 failIC 를 눌렀을 떄 둘 다 true가 뜨는데 correctIC 조건 처리를 왜 하는지 모르겠다.
const { correct } = data.data;
return correct;
} catch (error) {
throw new Error(String(error));
}
};
const handleClickOnBtn = async () => {
try {
const res = await postAnswer(correctIc);
console.log(res);
navigate('/result');
} catch (error) {
throw new Error(String(error));
}
};
handleClickOnBtn
에서 postAnswer
을 불러오고 있는데, handleClickOnBtn
에서 또 다시 async/await
을 사용해야하나 ? 라는 질문
postAnswer
함수가 비동기 함수이기 때문
postAnswer
함수는 async
함수로 정의되어있다. 이는 Promise
를 반환하는 함수를 의미.
await postAnswer
사용하여 비동기 함수가 완료될 때까지 기다리고, 그 결과 값을 반환받을 수 있다.
만약 await
를 사용하지 않으면 postAnswer
함수는 즉시 Promise
객체를 반환.
await 말고 Promise의 try,catch 메서드 사용가능, 하지만 가독성이 떨어짐.
바꿔서 사용은 가능하다. 하지만 코드 가독성을 떨어뜨림으로 async/await을 사용하자
const handleClickOnBtn = () => {
postAnswer(correctIc)
.then((res) => {
console.log(res);
navigate('/result');
})
.catch((error) => {
throw new Error(String(error));
});
};
안녕하세요 5_wintaek님, 우연히 방문했다가 코드 공유해주신 부분이 있어서 짧게 몇 자 남깁니다.
'await 키워드를 두 번 연속으로 사용해도 괜찮을까?' 하는 의문때문에 글을 작성하신 것 같은데요, 우선 사용하셔도 '문제'는 없습니다. 하지만, 뭔가 원하시는 방향으로 고칠 수 있는 부분은 있을 것 같아요.
첨부해주신 코드를 보면 handleClickOnBtn 을 async 함수로 만드신 이유는 error catch를 활용한 navigate 분기처리를 위한 것으로 읽히는데요.
아마도 async 함수로 만들고 postAnswer 함수 앞에 await 키워드를 사용하지 않으면 원하시는 분기처리가 안될거에요. 왜냐하면 비동기함수에서의 에러처리는 동기컨텍스트에서 캐치할 수 없기 때문이에요. 이 부분에 대해서 궁금하시다면 한번 '비동기 에러처리' 라는 키워드로 검색해보시면 더 좋은 글들이 많을 것 같습니다.
우선 결론으로 넘어가자면 분기처리를 현재 correct 를 사용하지 않으신다면 return문을 제거하고 해당 위치에서 navigate를 통해 분기처리를 해주시면 될 것 같단 생각이 듭니다. 굳이 then().catch() 를 사용하지 않고 말이죠!