我正在尝试使用HTML5地理位置API和Google Maps Geocoding API获取用户的国家/地区名称。我正在使用自定义模式来优雅地请求权限。如何访问返回的国家简称?目前,我得到undefined
。
function fetchCountry() {
showCustomModal('To show data most relevant to you we need your location', {
options: ['done', 'cancel']
})
.then(function(value) {
if(value == 'cancel') return;
navigator.geolocation.getCurrentPosition(function (position) {
//if user agrees to share location info
let latitude = position.coords.latitude;
let longitude = position.coords.longitude;
fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}`)
.then(response => response.json())
.then(function (response) {
//checking geocoding api response for errors
if (response.status != 'OK' || !response.results[0]) return;
for (let addressComponent of response.results[0].address_components) {
if (addressComponent.types.includes('country'))
return addressComponent.short_name; //returning country short name
}
});
}, function () {
//if does not gets the current position show error message
//do something...
});
});
}
let country = fetchCountry();
答案 0 :(得分:1)
您可以引入一个承诺,当subseuqnet异步请求被解决(成功)或被拒绝(失败)时,该承诺将被解决, 如下所示
function fetchCountry() {
// Add return statement here
return showCustomModal('To show data most relevant to you we need your location', {
options: ['done', 'cancel']
})
.then(function(value) {
if(value == 'cancel') return;
// Introduce the promise which will asynchronously process the post-modal request logic, and return a result on completion
// or failure of that request
return new Promise(function(resolve, reject) {
navigator.geolocation.getCurrentPosition(function (position) {
//if user agrees to share location info
let latitude = position.coords.latitude;
let longitude = position.coords.longitude;
fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}`)
.then(response => response.json())
.then(function (response) {
//checking geocoding api response for errors
if (response.status != 'OK' || !response.results[0]) {
reject(); // Call reject to relay and failed request
}
for (let addressComponent of response.results[0].address_components) {
if (addressComponent.types.includes('country'))
resolve(addressComponent.short_name); //returning country short name, via resolve
}
});
}, function () {
//if does not gets the current position show error message
//do something...
reject('Failed to get position') // Call reject to relay and failed request
});
})
});
}
fetchCountry().then(function(country) {
//access country here
}).catch(function(err) {
//handle error here
})