**上下文:**我关于getCurrentPosition和async函数的问题的后续问题。在Odin Project中工作并尝试构建一个简单的天气应用程序,我希望实现一个功能,即应用程序使用navigator.geolocation
功能自动将用户的本地天气填充到应用程序中。
**我所期望的:**用户点击“block”,loadApp
if语句运行并默认为一个硬编码的坐标(堪萨斯lol),如果用户点击“allow”,则获取其纬度/经度位置,页面可以对用户的本地天气发出初始API请求。
**发生了什么:**用户点击了“block”,整个代码停止了。只是,没有去任何地方。我不知道如何让它回到loadApp
中的if语句。(点击允许工作正常,当我在我的家用机器上测试时,我能够成功地获得坐标)
**我的尝试:**在Google上搜索了这个问题,并尝试编写一个函数来查询全局权限对象的状态。我想如果我能找到权限被拒绝的 * 任何地方 *,也许我可以摆脱它,但无论在哪里检查,状态都只是“提示”。我还尝试在我的promise中使用reject
语句,但只有当用户根本没有地理位置时才能运行。
function getLocationFromUser (){
//promisify the callback by wrapping it in a promise and return the promise immediately
//wrapping things in a promise is a way to return from a callback
return new Promise((resolve, reject) => {
if ('geolocation' in navigator) {
navigator.geolocation.getCurrentPosition((position) => {
console.log(position.coords.latitude, position.coords.longitude);
let defaultCoords = [];
defaultCoords.push(position.coords.latitude);
defaultCoords.push(position.coords.longitude);
//this resolve statement is what is actually returned by the promise
resolve((defaultCoords));
});
} else {
reject(console.log('Geolocation not supported'));
}
});
}
async function loadApp(){
let defaultLocation = await getLocationFromUser();
if(!defaultLocation){
alert('user denied us');
//load a default city
getWeatherData(37.9795, 23.7162);
} else {
console.log(defaultLocation);
let lat = defaultLocation[0];
let lon = defaultLocation[1];
getWeatherData(lat, lon);
}
}
function getWeatherData(lat, lon){
//this is where my API call will run using the lat and lon data
}
loadApp().then(data => console.log(data)).catch(err => console.log(err));
1条答案
按热度按时间wlzqhblo1#
https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API/Using_the_Geolocation_API.
根据Mozilla Geolocation API,函数
navigator.geolocation.getCurrentPosition(success, error)
有两个参数。第一个参数有在成功检索位置时运行的函数,你已经编码好了。第二个参数有在用户拒绝你的请求时运行的函数,我已经编码好了,在注解中写着"权限被拒绝"。为了让函数工作,将经度和纬度的值都更改为所需的硬编码坐标,它应该可以工作。