이 글은 jQuery에서 $.when.apply($, reqs).done()을 처음 써보는 분이 바로 따라 할 수 있게 정리한 내용이다.
반복문에서 $.ajax를 여러 번 호출하다 보면, “저장되었습니다” 같은 안내를 언제 띄워야 할지 헷갈릴 때가 많다.
여기서는 요청을 reqs 배열에 모아두고, 모든 요청이 끝난 뒤에만 완료 팝업을 띄우는 방식(done/fail)으로 처리한다.
목표
- $.ajax 저장 요청을 여러 번 보내더라도 전부 성공했을 때만 “저장되었습니다”를 띄운다
- 중간에 하나라도 실패하면 공통 에러 처리(ajaxFail) 로 넘긴다
1) 설치 / 로드
<!-- jQuery CDN 예시 (이미 프로젝트에 포함되어 있으면 생략) -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
2) 기본 예제
핵심은 reqs 배열에 ajax 요청(Deferred)을 담아두고, $.when.apply로 “전체 완료”를 기다린 다음 done/fail에서 후처리를 하는 것이다.
// ajax 요청들을 모아둘 배열
var reqs = [];
// 예시 데이터(여러 줄 저장 가정)
for (var i = 0; i < row_list.length; i++) {
var data = setInsertData(i);
reqs.push(
$.ajax({
type: "POST",
url: "/json.cmx",
dataType: "json",
data: data
})
);
}
// reqs 안의 모든 요청이 끝날 때까지 기다린다
// apply를 쓰면 배열을 $.when(ajax1, ajax2, ...) 형태로 "펼쳐서" 넣는 효과
$.when.apply($, reqs)
.done(function () {
// 전부 성공했을 때만 실행
alert("저장되었습니다.);
}).fail(function (xhr, textStatus, errorThrown) {
// 하나라도 실패하면 실행
ajaxFail(xhr, textStatus, errorThrown);
});
왜 apply를 쓰나?$.when()은 원래 $.when(a, b, c)처럼 “여러 인자”를 받는다. 그런데 반복문으로 만든 요청이 배열(reqs)에 들어있기 때문에 $.when.apply($, reqs)로 배열을 인자처럼 펼쳐 넣는다.
3) 옵션 / 커스터마이징
- 요청이 0개일 때 처리: row_list가 비면 done이 바로 실행되는 걸 기대하는지, “저장할 데이터 없음”을 띄울지 결정
- 저장 실패한 행(i) 추적: reqs.push할 때 i를 함께 기록해서 어떤 행이 실패했는지 로그로 남기기
// 실패한 행을 추적하고 싶을 때
var reqs = [];
var meta = []; // i를 같이 보관
for (var i = 0; i < row_list.length; i++) {
meta.push(i);
reqs.push($.ajax({ type:"POST", url:"/json.cmx", dataType:"json", data:setInsertData(i) }));
}
$.when.apply($, reqs)
.done(function () {
alert("저장되었습니다.");
}).fail(function (xhr, textStatus, errorThrown) {
// 어떤 요청이 실패했는지까지 완벽히 찍으려면,
// 서버 응답(xhr.responseText) + 요청 데이터에 식별자를 넣는 방식이 좋다.
ajaxFail(xhr, textStatus, errorThrown);
});
정리
- reqs에
$.ajax()반환값을 모은다 $.when.apply($, reqs)로 “전체 완료”를 기다린다- done은 “전부 성공”, fail은 “하나라도 실패”일 때 실행된다
'Programmer > JAVASCRIPT' 카테고리의 다른 글
| GPT로 간트차트 라이브러리 만들다가 포기한 이유 (그리고 배운 점) (0) | 2026.01.14 |
|---|---|
| history.back() 대신 뭘 써야 할까? 웹앱에서의 뒤로 가기 정리 (0) | 2026.01.08 |
| JavaScript for문 vs forEach vs for...of – 언제 어떤 걸 써야 할까? (0) | 2026.01.06 |
| Chart.js 사용법 – 반응형 포함, 초보자를 위한 자바스크립트 차트 예제 (0) | 2026.01.05 |
| JavaScript에서 JSON 객체 key를 동적으로 다루는 방법 (0) | 2025.12.31 |