[TIL] 2021-03-14

Updated:

오늘의 문제점 해결

문제 )response로 받은 값이 최종적으로 null 값이 나온 경우

  • initData라는 함수를 useEffect로 실행할 때 콘솔에 데이터가 나왔다가 다시 null로 회귀하는 현상

기존 문제의 코드

const initData = useCallback(async () => {
    try {
      // const response = await moviesApi.nowPlaying();
      // 객체 비구조화 할당을 통해 위 코드와 동일하게 작동하는 방식

      // const {
      //   data: { results: nowPlaying },
      // } = await moviesApi.nowPlaying();
      const {
        data: { results: nowPlaying },
      } = await moviesApi.nowPlaying();

      const {
        data: { results: upcoming },
      } = await moviesApi.upcoming();

      const {
        data: { results: popular },
      } = await moviesApi.popular();

      setValues({ ...values, nowPlaying, popular, upcoming });
    } catch {
      setValues({
        ...values,
        error: "요청하신 무비의 정보를 찾을 수 없습니다.",
      });
    } finally {
				setValues({...values, loading : false })
    }
  }, []);

useEffect(() => {
    initData();
  }, [initData]);

해결

해결 코드

finally {
	if (error !== null) {
	  setValues({ ...values, loading: false });
  }
}

  • try..catch/finally 에서 finally는 try든 catch든 실행이 되는 코드다. 헌데 finally 코드에서 values를 복제하게 되니 state가 변경되서 그런거 같은데… 다시 생각 해 볼 필요가 있는 코드

다른 해결방법

  • ...values 쓰지않고 해당하는 state의 값을 넣어준다.
const initData = useCallback(async () => {
    try {
      const {
        data: { results: nowPlaying },
      } = await moviesApi.nowPlaying();

      const {
        data: { results: upcoming },
      } = await moviesApi.upcoming();

      const {
        data: { results: popular },
      } = await moviesApi.popular();

      setValues({ nowPlaying, popular, upcoming });
    } catch {
      setValues({
        error: "요청하신 무비의 정보를 찾을 수 없습니다.",
      });
    } finally {
				setValues({ loading : false })
    }
  }, []);