Callback과 ajax

질문1. callback함수를 벗어나면 callback함수 내에서 전역변수에 담았던 값들이 없는게 당연한건가요?
질문2. 그 대안으로 callback 함수 내에서 전역변수에 담고 callback 끝나기 전에 다른 함수를 호출하여 그 함수 내의 ajax를 통해 전역변수에 저장된 데이터를 서블릿에 전송 하려고 하는데요…해보니까 값이 null이던데요 어느부분이 잘못된걸까요?

@kimingz

  1. 전역 변수이면 콜백 함수에서 할당된 값이 다른 곳에서도 할당된 상태로 있어야 맞습니다. 그러나 할당된 적이 없거나, 너무 이르게 값을 체크했거나 하면 디폴트 값으로 있을 것입니다.
  2. 첫 번째 콜백에서 값이 정확히 할당되어 있는지부터 확인해 보면 좋을 거 같습니다.

전역 변수의 값이 null로 나온 원인은 여러 가지가 있을 수 있습니다.
문제가 되는 코드를 올려주시면 살펴보겠습니다.

1개의 좋아요

해당부분 소스입니다.
ajax에서 배열을 전송해서 서블릿에서 request.getParameterValues로 받으려고 하는데 latss와 lngss가 null이여서 NullPointerException이 뜹니다.

var noss = [];
var latss = [];
var lngss = [];
var loofCnt=0;

function calPos(){
	loofCnt=0;
	noss=[];
	latss=[];
	lngss=[];
	var time = setInterval(function(){
		if(loofCnt < num.length){
		go(loofCnt);
		}else{
			clearInterval(time);
		}
	},50);
	var go = function(getCnt){ 
		searchArea=address[getCnt];
		console.log(getCnt);  
		var pushFlag=0;
		var call2Flag=0;
		var callback2=function(result2, status2) { 
			call2Flag=1;
			pushFlag = pushFlag+1;
			if(pushFlag == 1){
			if (status2 === daum.maps.services.Status.OK) {
			
			straddr2 = result2[0].address_name;
		
		        noss[getCnt]=getCnt+'';
		        latss[getCnt]=result2[0].y;
		        lngss[getCnt]=result2[0].x; 
		    
			}else{
			    noss[getCnt]=getCnt+'';
			    latss[getCnt]='';
			    lngss[getCnt]=''; 
			}
			if((getCnt+1)==num.length){
				implFunc();
			}
			}
		}
		var callback = function(result, status) {
		    if (status === daum.maps.services.Status.OK) {
		       straddr = result[0].address_name;
		      
	           /* 주소검색 2*/
	           var geocoder2 = new daum.maps.services.Geocoder();	
	       	   geocoder2.addressSearch(straddr,callback2);
		    }  
		}
					
		/* 장소검색 */
		var places = new daum.maps.services.Places();
	        places.keywordSearch(searchArea, callback);
		    
	        /* 주소검색 */
		var geocoder = new daum.maps.services.Geocoder();	
		geocoder.addressSearch(searchArea,callback2);
		loofCnt=loofCnt+1;
	}
	
	
}

function implFunc(){
	output='';
	dataUrl = "insert.hw";
		   $.ajax({
			   type      : 'POST', 
				url : dataUrl,
				data : {
				noss : noss,
			        latss : latss,
			        lngss : lngss
			    },
				success : function() {
					alert("성공");
				},
				error : function(request,status,error) {
					alert("code:"+request.status+"\n\n"+"message:"+request.responseText+"\n\n"+"error:"+error);
				}
			});
}

@kimingz
콟백 함수 호출될 때 값들이 제대로 들어오는지 확인해 보세요.

네 제대로 들어옵니다

다시 해보니까요 setInterval 반복을 10회로 제한하고 해보니까 제대로 되는것 같습니다.
그런데 반복횟수를 엄청 늘리면 NullPointerException 에러가 나는데 그 이유가 궁금합니다.

너무 많은 요청이 있다면 초당 리퀘스트 제한에 걸렸을 수 있습니다.
응답값 중에 실패한 것들을 찾아보시고 응답값을 확인해보세요.