728x90
async await 을 함수에서 리턴을 할 때 주의할 점이 있다.
Bad 사례처럼, 이미 async가 붙은 함수에서는 리턴값 가장 바깥에 Promise<>가 붙기 때문에,
리턴값은 Promise<>가 붙으면 안된다.
updateUserGoalVisible = async (
goalId: number,
visible: boolean,
): Promise<Goal> => {
/*
👎 Bad
이미 async가 붙었기 때문에 리턴값은 순수한 Goal이어야 하는데,
this.prisma.goal.update({}) 를 리턴함으로써 리턴값은 Promise<Goal>이 되어버린다.
그래서 이 함수의 최종 리턴값은 Promise<Promise<Goal>> 이 되는 것이다.
*/
return this.prisma.goal.update({
where: {
id: goalId,
},
data: {
isVisible: visible,
},
});
/*
👍 Good
await this.prisma.goal.update({})이 순수한 Goal이므로,
이 함수의 최종 리턴값은 Promise<Goal> 이 된다.
*/
return await this.prisma.goal.update({
where: {
id: goalId,
},
data: {
isVisible: visible,
},
});
};
관련 자료
https://github.com/microsoft/TypeScript/issues/27711
Promise<Promise<T>>는 존재할 수 있냐 없냐에 대한 열띤 토론이 이뤄지고 있다..
위 Bad 예시가 문제가 없었던 이유는, 여러번 wrapping된 Promise여도 결국에는 다 까지기 때문이 아닌가 싶다.
그러나 가끔 시간차?의 문제로 다 까지지 않아 기대되는 리턴값을 리턴하지 못하는 것인가?
포스팅 배경
운영중인 서비스에서 가끔 이러한 서버 로그가 찍혔다.
eachDailyMission.commonDailyMission에서 eachDailyMission은 항상 null이 아닌 값인데, 못찾는다는 것이다.
-> 해당 함수를 보니, 리턴값이 Promise<Promise<T>>이었다. 그래서 가끔 리턴값이 T가 아닌 한겹만 벗겨진 Promise<T>여서 그랬던거 아닌가 싶다.
TypeError: Cannot destructure property 'commonDailyMission' of 'eachDailyMission' as it is null.
잘못된 부분이 있다면 댓글로 알려주시면 감사하겠습니다!
참고하면 좋을 글
'Solve Problem > Deep Dive' 카테고리의 다른 글
웹과 React Native에서 CORS는 어떻게 다를까? (+2024년 12월 근황) (0) | 2024.12.16 |
---|---|
Vanilla JS로 SPA 화면전환 구현해보기 (feat. 프레임워크는 소중하다) (0) | 2024.10.18 |
Next 폴더 구조에 대한 고민: 관심분리 (0) | 2023.07.26 |
메세지 큐 시스템: SQS,Worker,Cron,Queue API Server (0) | 2023.03.12 |
Debounce로 중복호출 막기 (useCallback 사용해 함수재생성 방지까지) (2) | 2023.03.05 |