일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- bootstrap
- 빌드
- 인텔리제이
- dependency
- 메소드
- 제너릭
- 싱글턴
- maven
- 무한
- suvlet
- Jenkins
- boxing
- Scanner
- start.spring.io
- Java
- 박싱
- 컬렉션
- 루프
- 콜렉션
- 스프링
- 내장객체
- 클래스
- 제네릭
- 자동형변환
- 싱글톤
- https://start.spring.io
- Short
- wrapper
- 언박싱
- unboxing
Archives
- Today
- Total
Developer Gonie
JQuery 특정메소드 비동기적 실행방식으로 인한 문제발생 및 해결과정 본문
JQuery $.getJSON() 메소드의 비동기적 실행방식으로 인한 문제발생
처음에 의도했던바
makeAreas() 메소드에서 JSON 파일의 내용을 읽어와 전역변수인 areas 를 채워넣은 다음에
loadMap() 메소드에서 areas 변수에 저장된 좌표정보들을 이용해 폴리곤을 지도위에 그려내려 하였다.
예상치 못한 결과
JQuery 메소드 중에서도 $.getJSON(), $.ajax() 메소드는 비동기 방식으로 동작하여
그 메소드를 호출한 직후(메소드의 실행이 끝나지 않았더라도) 바로 다음 구문을 실행하고 있었다.
이 때문에 loadMap() 메소드에서 비어있는 areas를 이용하여 동작하였고 원하는 결과대로 실행되지 않았다.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=API키를 입력하세요"></script>
<script>
// 지도에 폴리곤으로 표시할 영역데이터 배열(전역변수)
var areas = [];
$(function(){
makeAreas();
loadMap();
});
function makeAreas(){
alert("makeAreas() 호출됨");
$.getJSON("resources/only_seoul.json", function(geojson){ // json 파일관련 객체를 얻음
var units = geojson.features; // 파일에서 key값이 "features"인 것의 value를 통으로 가져옴(이것은 여러지역에 대한 정보를 모두 담고있음)
$.each(units, function(index, unit){ // 1개 지역씩 꺼내서 사용함. val은 그 1개 지역에 대한 정보를 담음
var coordinates = []; //좌표 저장할 배열
var name = ''; // 지역 이름
coordinates = unit.geometry.coordinates; // 1개 지역의 영역을 구성하는 도형의 모든 좌표 배열을 가져옴
name = unit.properties.SIG_KOR_NM; // 1개 지역의 이름을 가져옴
var ob = new Object();
ob.name = name;
ob.path = [];
$.each(coordinates[0], function(index, coordinate){ // []로 한번 더 감싸져 있어서 index 0번의 것을 꺼내야 배열을 접근가능.
ob.path.push(new kakao.maps.LatLng(coordinate[1], coordinate[0]));
});
areas[index]=ob;
});//each
});//getJSON
}
function loadMap(){
alert("loadMap() 호출됨");
alert(areas.length);
//지도를 로드하고, areas 정보 이용해서 폴리곤을 지도위에 그려냄
}
</script>
해결방법
$.getJSON() 메소드를 호출하기 전에 $.ajaxSetup({ async: false }); 을 호출해주면
해당 메소드가 비동기가 아닌 동기화 방식으로 동작하게 되어 위에서 구현하고자 했던 바가 해결된다.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=API키를 입력하세요"></script>
<script>
// 지도에 폴리곤으로 표시할 영역데이터 배열(전역변수)
var areas = [];
$(function(){
makeAreas();
loadMap();
});
function makeAreas(){
alert("makeAreas() 호출됨");
$.ajaxSetup({ async: false }); // $.getJSON() 메소드의 동기화 처리
$.getJSON("resources/only_seoul.json", function(geojson){ // json 파일관련 객체를 얻음
...
});
}
function loadMap(){
alert("loadMap() 호출됨");
alert(areas.length);
//지도를 로드하고, areas 정보 이용해서 폴리곤을 지도위에 그려냄
}
</script>
'개인 공부 > Javascript' 카테고리의 다른 글
$.ajax(), $.getJSON() 등의 비동기 메소드를 순차처리 되도록 하는 방법 2가지(Promise, ajaxSetup) (0) | 2022.09.23 |
---|---|
jQuery로 append 시 이벤트가 동작 안할 때 해결방법 (0) | 2022.09.14 |
부트스트랩 multiselectsplitter 예시코드 example (0) | 2022.09.13 |
file multitple 속성으로 선택한거 미리보기 보여지게 하기 (0) | 2022.09.13 |
Javascript와 JQuery 코드의 실행순서(동기, 비동기) (0) | 2022.09.07 |
Comments