在javascript中,当位置权限被拒绝时,是否可以触发事件发生?

kxe2p93d  于 2022-12-28  发布在  Java
关注(0)|答案(1)|浏览(129)

**上下文:**我关于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));
wlzqhblo

wlzqhblo1#

https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API/Using_the_Geolocation_API.

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));
        }, 
        // When the permission is denied
        () => {
            // Add the longitudes and latitudes of the hard-coded coordinate here
            const longitude = 0;
            const latitude = 0;
            resolve([latitude, longitude])
        );
      } else {
        reject(console.log('Geolocation not supported'));
      }

根据Mozilla Geolocation API,函数navigator.geolocation.getCurrentPosition(success, error)有两个参数。第一个参数有在成功检索位置时运行的函数,你已经编码好了。第二个参数有在用户拒绝你的请求时运行的函数,我已经编码好了,在注解中写着"权限被拒绝"。为了让函数工作,将经度和纬度的值都更改为所需的硬编码坐标,它应该可以工作。

相关问题