n번의 비동기 요청 시 Promise 재귀함수 처리
상황
공공 API 데이터를 활용 중 최대 1000 개의 데이터만 불러올 수 있는 제한사항으로 인해 전체 데이터를 불러와 데이터를 추출하는 과정에 문제가 생겼다.
다행히 API 요청 결과 데이터 중 전체 데이터의 전체 개수를 나타내는 데이터가 존재해 이를 활용하여 n 번의 요청으로 (n x 1000) 개의 데이터를 가져오도록 설계하기로 했다.
설계
- 비동기 처리의 실행 순서를 보장하기 위해 async await 키워드를 사용
- 원하는 만큼의 API 요청하기 위해 재귀함수로 형태를 활용
코드
코드 설명
- axios 패키지를 활용해 API 데이터를 처리할 함수를 선언
- 함수안에 재귀 함수로 활용할 함수 recursiveReq를 async 키워드와 함께 선언
- axios.get 메서드를 통해 실제 API 요청에 반환되는 promise 객체를 반환
- 반환된 promise 객체를 활용해 then 메서드안에서 특정 조건에 맞게 재귀함수를 다시 호출하거나 종료
- 재귀 함수를 거쳐 완성된 결과값을 리턴
※ 실제 활용한 코드에서 처리 과정을 나타낼 수 있는 부분만 아래 예시코드로 나타냈으므로 유의
// API 함수
export const getDataAPI = async (param) => {
const { searchText } = param // 가상의 요청인자
const result = []
// API 요청을 할 가상의 재귀 함수
const recursiveReq = async () => {
// 가상의 axios 요청 부분
await axios.get('APIURL')
.then(async (data) => {
// 비동기 요청으로 반화된 가상의 데이터 배열
const apiDataArr = data.data
// 검색 옵션에 맞는 데이터 추출 후 결과 배열에 저장
result.push(...apiDataObj.row.filter((data) => data.FACLT_NM === searchText))
// 반환되는 배열이 있다면 요청을 다시 보냄
if (apiDataArr.length > 0) await recursiveReq()
})
}
// 재귀 함수 실행 부분
await recursiveReq()
return result
}
참고
'JS' 카테고리의 다른 글
[JS] 자세히 알아둬서 나쁠 것 없는 정규 표현식과 사용방법 (0) | 2023.10.16 |
---|---|
(input.type=text) 엔터 시 submit 되는 상황 방지 (0) | 2023.06.19 |
eslint prettier 코드 포맷팅 통합 (0) | 2023.06.08 |
URI 인코딩 및 디코딩 관련 js 메서드 (0) | 2023.06.07 |
JavaScript 내장 객체 Map (0) | 2023.02.17 |