JS
javascript 비동기 재귀 함수
시연이아빠
2020. 9. 28. 16:46
재귀 함수 + 비동기
const onSubmit = async () => {
let response = await create_customer();
if (response.status !== 200) {
return onComplete(false, '수집 되지 않은 좌표가 있습니다');
}
const invalidMutualDistanceCustomers = response.data;
response = await getMutualDistanceByTmapRecursive(invalidMutualDistanceCustomers);
try {
response = await create_route();
} catch (error) {
return onComplete(false, '경로 생성 실패');
}
return onComplete(true, '배차 완료');
};
위의 코드는 submit 버튼을 누르면 동작하는 async 함수다.
고객을 생성하고 유효하지 않은 고객들(invalidMutualDistanceCustomers 배열)을 재귀 + 비동기 함수로 처리 하려한다.
setTimeout 대신 사용할 비동기 sleep 함수
const timeout = ms => new Promise(resolve => setTimeout(resolve, ms));
재귀 함수
const getMutualDistanceByTmapRecursive = async (invalidMutualDistanceCustomers: Array) => {
const customer: Array = invalidMutualDistanceCustomers.pop();
if (customer === undefined) {
return;
}
await timeout(800);
const response = await getMutualDistanceByTmap(customer[0], customer[1]);
const totalDistance = response.data.features[0].properties.totalDistance;
const jsonMap = JSON.stringify(response.data);
await save(customer[0], customer[1], totalDistance, jsonMap);
await getMutualDistanceByTmapRecursive(invalidMutualDistanceCustomers);
}
1. 배열을 하나씩 pop 해주고 배열이 하나도 없으면(customer === undefined) 재귀 함수 종료
2. await timeout(800) : 0.8초 뒤에 api를 호출해라(api 초당 제한)
3. tmap api 호출하고 저장한 다음 다시 재귀 함수(getMutualDistanceByTmapRecursive) 호출
결론 : 비동기 처리는 까다로우니 async, await를 많이 박자