구글 지도 Places opening_hours.open_now 대신 isOpen() 함수 쓰기
- created
- category
- worklog
구글 지도 API에서 장소정보중에 open_now
라고 해당 스팟이 영업중인지 확인하는 데이터가 있었는데 디프리케이티드 되어 2020년 11월부터는 중단된다는 메시지가 콘솔에 나타났다.
js?key=APIKEY&libraries=places&callback=UIPrototypeMap:57 open_now is deprecated as of November 2019 and will be turned off in November 2020. Use the isOpen() function from a PlacesService.getDetails() result instead. See https://goo.gle/js-open-now
쓰는 방식이 좀 달라서 시간 작업 소요가 좀 있던터라 기록을 남겨둔다.
PlaceResult
가 받아온 오브젝트라면 PlaceResult.opening_hours.open_now
만으로도 Boolean 타입으로 값을 받아올 수 있어서 영업중인지 아닌지 영업정보가 없는지를 바로 판별할 수가 있었는데 콘솔창에 안내되어 있는 것만 얼핏보고 PlaceResult.opening_hours.isOpen()
과 같이 해서는 모두 undefined
값만 받아보게 된다.
new google.maps.places.PlacesService(attrContainer).getDetails({
placeId: '...',
fields: ['opening_hours','utc_offset_minutes'],
}, function (place, status) {
if (status !== 'OK') return; // something went wrong
const isOpenAtTime = place.opening_hours.isOpen(new Date('December 17, 2020 03:24:00'));
if (isOpenAtTime) {
// We know it's open.
}
const isOpenNow = place.opening_hours.isOpen();
if (isOpenNow) {
// We know it's open.
}
});
출처 : https://developers.google.com/maps/documentation/javascript/place_field_js_migration
위 예제가 더 정확한데 저렇게 별도로 영업시간 체크를 해줘야한다. 게다가 비동기로 결과를 받기 때문에 체크하는 방식을 변경해줄 수 밖에 없었다.
// service는 다른 곳에서 new google.maps.places.PlacesService(attrContainer) 선언함
function placeIsOpen(id) {
if (!service) {
return undefined;
}
service.getDetails({
placeId: id,
fields: ['opening_hours', 'utc_offset_minutes']
}, function(place, status) {
if (status !== 'OK') {
return undefined;
}
return place.opening_hours.isOpen();
});
return undefined;
}
같이 만들어놓고 바로바로 open_now
쓰던 것처럼 넣었더니 한번에 넣는 값이 8개가 넘으면 OVER QUERY LIMIT
오류를 뱉고, 어차피 비동기로 처리되기 때문에 제 시점에 영업 여부를 넣을 수가 없었다.
그래서 ① 담아 놓고 넣거나, ②. 8개 이하로 끊어서 넣거나, ③ 필요할 시점에 넣어야 했는데 다행히 스팟 정보는 스와이퍼 형태로 제공하는 화면이어서 활성화된 스팟 지점인 경우에만 영업 여부 체크하여 넣는 것으로 변경했다.