질문1. callback함수를 벗어나면 callback함수 내에서 전역변수에 담았던 값들이 없는게 당연한건가요?
질문2. 그 대안으로 callback 함수 내에서 전역변수에 담고 callback 끝나기 전에 다른 함수를 호출하여 그 함수 내의 ajax를 통해 전역변수에 저장된 데이터를 서블릿에 전송 하려고 하는데요…해보니까 값이 null이던데요 어느부분이 잘못된걸까요?
- 전역 변수이면 콜백 함수에서 할당된 값이 다른 곳에서도 할당된 상태로 있어야 맞습니다. 그러나 할당된 적이 없거나, 너무 이르게 값을 체크했거나 하면 디폴트 값으로 있을 것입니다.
- 첫 번째 콜백에서 값이 정확히 할당되어 있는지부터 확인해 보면 좋을 거 같습니다.
전역 변수의 값이 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);
}
});
}
네 제대로 들어옵니다
다시 해보니까요 setInterval 반복을 10회로 제한하고 해보니까 제대로 되는것 같습니다.
그런데 반복횟수를 엄청 늘리면 NullPointerException 에러가 나는데 그 이유가 궁금합니다.
너무 많은 요청이 있다면 초당 리퀘스트 제한에 걸렸을 수 있습니다.
응답값 중에 실패한 것들을 찾아보시고 응답값을 확인해보세요.