[react native] axios timeout not working

chosh·2023년 4월 24일
0

axios config에서 timeout이라는 키로 ms 를 전달하면
지정한 시간보다 통신이 더 오래 걸리면 요청을 중단 시킬수 있습니다.

예를 들면
1. 인스턴스를 생성하면 timeout값은 디폴트값인 0으로 지정되어 있습니다.
2. 인스턴스의 디폴트값을 바꿔줄수도 있습니다.
3. axios config를 전달할때 timeout키에 시간을 전달하면 타임아웃시간을 지정할 수 있습니다.

const instance = axios.create();

instance.defaults.timeout = 2500;

instance.get('/longRequest', {
  timeout: 5000
});

5초동안 응답이 없으면 요청 중단


이번에 React Native로 작업한 앱에서 axios timeout이 작동하지 않는 이슈가 있어서 CancelToken을 이용한 요청 중단을 적용하고 정리 하였습니다.

  1. 요청하는 axios 인스턴스의 CancelToken -> source 를 변수에 저장

    • const source instance.CancelToken.source()
  2. source.token을 요청하는 axios configcancelToken에 전달

    • instance('/longRequest', { cancelToken: source.token })
  3. setTimeout을 이용해 요청 취소

    • const timer = setTimeout(() => {
          source.cancel();
          return Promise.reject('timeout');
      }, 10000);
  4. 요청 성공시 clearTimeout을 이용해 취소 로직 해제

    • clearTimeout(timer)

최종 코드

const instance = axios.create();
const source = instance.CancelToken.source()

const aget = async (url: string) => {
  	const timer = setTimeout(() => {
	    source.cancel();
    	return Promise.reject('timeout');
	}, 10000);
  
  	const axiosConfig = {
     	url: url,
      	method: "get",
      	cancelToken: source.token
    }
  
	try {
	  	const response = instance(axiosConfig)
        
        clearTimeout(timer)
      	return response.data
    } catch (err) {
      	clearTimeout(timer)
      	return Promise.reject(err.response?.data);
    }
}

clearTimeout은 정상적으로 반환값이 도착했거나,
error 값이 도착했으면 시간초과는 확인할 필요가 없기 때문에 사용하였습니다.

profile
제가 참고하기 위해 만든 블로그라 글을 편하게 작성했습니다. 틀린거 있다면 댓글 부탁드립니다.

0개의 댓글

관련 채용 정보