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

将回调式获取地理位置代码转换为Promise的实现求助

问题排查与修正方案

你的Promise版本代码存在两个核心问题:

  • 错误把getCurrentPosition方法本身resolve出去了,而不是调用该方法并在它的成功回调里返回位置数据。这导致then回调里拿到的是个函数,根本不是位置对象,自然访问不到coords属性。
  • 错误信息不匹配:浏览器不支持地理定位的分支,却返回了"用户拒绝授权"的提示;而用户拒绝授权的错误逻辑完全没处理。

修正后的代码

const getUserLocation = () => {
    return new Promise((resolve, reject) => {
        if (navigator.geolocation) {
            // 调用getCurrentPosition,在成功回调里resolve位置数据,失败回调里reject错误
            navigator.geolocation.getCurrentPosition(
                (position) => resolve(position),
                (err) => {
                    // 根据错误类型返回对应提示,也可以直接reject(err)
                    if (err.code === err.PERMISSION_DENIED) {
                        reject('用户拒绝了地理定位请求');
                    } else {
                        reject(`获取位置失败:${err.message}`);
                    }
                }
            );
        } else {
             reject('你的浏览器不支持地理定位功能');
        }
    })
}

getUserLocation()
    .then((position) => {
        console.log('经度:', position.coords.longitude);
        console.log('纬度:', position.coords.latitude);
    })
    .catch((err) => {
        console.log(err);
    })

关键修正点

  1. 不再直接resolve方法,而是调用getCurrentPosition,并传入两个匿名回调:成功时把position对象传给resolve,失败时把错误信息传给reject
  2. 区分了"浏览器不支持"和"用户拒绝授权/其他错误"两种场景的提示信息
  3. 在then回调里正确接收位置对象,访问其coords属性获取经纬度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:24:25