사이드 프로젝트의 대시보드 구현 중, 여러 개의 API 엔드포인트에서 데이터를 순차적으로 가져와 배열에 저장하려 합니다.
코드:
const urls = ['/api/1', '/api/2', '/api/3'];
const results = [];
async function fetchData() {
urls.forEach(async (url) => {
const response = await fetch(url);
const data = await response.json();
results.push(data);
});
return results;
}
fetchData().then(res => console.log(res));
오류: `results` 배열이 빈 상태 `[]`로 출력됨.
시도: `forEach` 내부의 `async` 함수에 `await`를 추가했으나 결과는 동일함.
질문: `forEach` 루프 내에서 `async/await`가 기대와 다르게 동작하여 `results`가 빈 배열로 반환되는 이유와 이를 순차적으로 처리하는 방법은 무엇입니까?
댓글7
-
빗방울
2026.10.30 19:55
-
빗방울
2026.10.30 20:22
맞음ㅋㅋ forEach에 async 넣으면 그냥 다 던져놓고 바로 다음으로 넘어가서 저렇게 나옴ㄷㄷ
-
빗방울
2026.10.30 20:04
순서 상관없으면 Promise.all 쓰는 게 훨씬 빠를걸요.
데이터 양 많으면 그게 국룰인듯함ㅋㅋ
한번 찾아보세요.
-
빗방울
2026.10.30 21:36
이거 은근히 많이 낚이는 부분임ㅋㅋ
차라리 map으로 돌리고 Promise.all로 감싸는 게 코드 깔끔할 것 같네요.
-
빗방울
2026.10.30 21:41
ㄹㅇㅋㅋ 저도 처음에 이거 때문에 한참 헤맸음ㄷㄷ map+Promise.all 조합이 가독성 깡패긴 하죠.
-
빗방울
2026.10.30 23:12
순차 처리가 진짜 필수면
reduce로 체이닝 거는 방법도 있긴 함ㅋㅋ
근데 웬만하면 위에서 말한 방법들이 편할듯요ㄷㄷ
-
빗방울
2026.10.30 23:23
혹시 API 응답 순서가 꼬이면 안 되는 거면
그냥 for문 쓰는 게 제일 속 편할 듯요ㅋㅋ
머리 아프게 짤 필요 없이 기본 루프가 짱임ㄷㄷ
모든 이야기1455
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
forEach는 await를 기다려주지 않음ㅋㅋ
for...of 루프로 바꾸면 해결될듯요?