将回调式获取地理位置代码转换为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); })
关键修正点
- 不再直接resolve方法,而是调用
getCurrentPosition,并传入两个匿名回调:成功时把position对象传给resolve,失败时把错误信息传给reject - 区分了"浏览器不支持"和"用户拒绝授权/其他错误"两种场景的提示信息
- 在
then回调里正确接收位置对象,访问其coords属性获取经纬度
内容的提问来源于stack exchange,提问作者Mad
相关产品推荐
相关产品推荐

