고전적인 비동기 패턴 처리 방식은
콜백함수입니다.
카카오 지도 JS API는 Promise를 비동기 함수의 리턴값으로 지원하지 않습니다.
하지만 사용자가 직접 Promise로 wrapping은 가능하죠. 간단합니다.
http://apis.map.kakao.com/web/sample/addr2coord/
이 예제를 Promise를 사용하는 코드로 만들어 보면,
const mapContainer = document.getElementById('map');
const mapOption = {
center: new kakao.maps.LatLng(33.450701, 126.570667),
level: 3
};
const map = new kakao.maps.Map(mapContainer, mapOption);
const geocoder = new kakao.maps.services.Geocoder();
const createOverlay = result => {
const coords = new kakao.maps.LatLng(result[0].y, result[0].x);
const marker = new kakao.maps.Marker({
map: map,
position: coords
});
const infowindow = new kakao.maps.InfoWindow({
content: '<div style="width:150px;text-align:center;padding:6px 0;">우리회사</div>'
});
infowindow.open(map, marker);
map.setCenter(coords);
};
const addressSearch = address => {
return new Promise((resolve, reject) => {
geocoder.addressSearch(address, function(result, status) {
if (status === kakao.maps.services.Status.OK) {
resolve(result);
} else {
reject(status);
}
});
});
};
// async-await
(async () => {
try {
const result = await addressSearch('제주특별자치도 제주시 첨단로 242');
createOverlay(result);
} catch (e) {
console.log(e);
}
})();
// or chaining using then
//addressSearch('제주특별자치도 제주시 첨단로 242')
// .then(createOverlay)
// .catch(console.log);
그리고…
전역변수는 말그대로 모든 영역에서 접근 가능한 변수일 것인데,
값을 할당하거나 가져오지 못한다는건 말이 안 됩니다.
질문자 분이 처한 상황은
비동기 로직이 여러 개 있고
특정 코드가 비동기 완료 전에 실행되어 전역 변수에 값을 할당하기 전에
전역 변수의 값을 참조하려 하고 있다고 추정할 수 있습니다.
해결책은 이 비동기 로직들이 원하는 순서대로 실행되도록 동기화 하는 것입니다.
콜백을 만들어 비동기 로직이 시작되는 함수에 넘겨서 콜백에서 콜백을 호출하는 방식으로 진행하시면
굳이 Promise를 사용하지 않아도 구현이 가능할거에요.
많이 배워갑니다 감사합니다!
다시보니 제가 for문에서 전역변수와 지역변수를 혼용해서 사용하다가 에러가 난거였네요. 죄송합니다.