You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中位置权限被拒时如何触发事件?天气应用问题

问题分析与解决

核心问题

你的代码停滞是因为getCurrentPosition在用户拒绝授权时,没有触发Promise的reject,导致Promise一直处于pending状态,await会一直等待下去,永远不会执行后面的逻辑。

原代码只处理了地理定位支持且用户允许、地理定位不支持这两种情况,但漏掉了用户拒绝授权的场景——getCurrentPosition提供了第二个回调参数,专门处理定位失败(包括用户拒绝、定位超时等)的情况,你需要在这个回调里调用reject。

修复后的代码

1. 完善getLocationFromUser函数

补全错误回调,在用户拒绝时触发Promise的reject:

function getLocationFromUser() {
  return new Promise((resolve, reject) => {
    if ('geolocation' in navigator) {
      navigator.geolocation.getCurrentPosition(
        // 成功回调:用户允许定位
        (position) => {
          const defaultCoords = [
            position.coords.latitude,
            position.coords.longitude
          ];
          resolve(defaultCoords);
        },
        // 错误回调:用户拒绝/定位失败
        (error) => {
          // error.code区分错误类型:1=用户拒绝,2=定位失败,3=超时
          if (error.code === error.PERMISSION_DENIED) {
            reject(new Error('用户拒绝定位授权'));
          } else {
            reject(new Error('定位失败:' + error.message));
          }
        }
      );
    } else {
      reject(new Error('浏览器不支持地理定位'));
    }
  });
}

2. 调整loadApp的错误处理逻辑

Promise被reject后,await会抛出异常,需要用try/catch捕获错误,而非通过!defaultLocation判断:

async function loadApp() {
  try {
    const defaultLocation = await getLocationFromUser();
    // 用户允许定位,使用获取到的坐标
    const [lat, lon] = defaultLocation;
    getWeatherData(lat, lon);
  } catch (err) {
    // 捕获到拒绝授权/定位失败/不支持的情况,使用默认坐标
    alert(err.message);
    // 替换为你需要的默认坐标(比如堪萨斯)
    getWeatherData(39.0119, -98.4842);
  }
}

function getWeatherData(lat, lon) {
  // 编写API请求逻辑
  console.log(`请求天气数据:纬度${lat},经度${lon}`);
}

loadApp().catch(err => console.log(err));

关键说明

  • getCurrentPosition的第二个回调参数是处理定位失败的核心,必须补上才能捕获用户拒绝的场景。
  • 用try/catch处理await的异常,是异步函数中错误处理的标准方式,比判断返回值更可靠。
  • 通过error.code可以区分不同错误类型,实现更精细化的处理(比如仅在用户拒绝时使用默认坐标,其他错误提示用户重新尝试)。

内容的提问来源于stack exchange,提问作者manski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:35:18