Promise 封装 navigator.geolocation.getCurrentPosition 的核心是将回调转为 resolve/reject,需支持超时控制(Promise.race)、保留完整 position 结构、透传 options 参数,并区分处理权限拒绝(code=1)、位置不可用(code=2)和超时(code=3)等错误。

用 Promise 封装 navigator.geolocation.getCurrentPosition 很简单,核心是把回调函数转成 Promise 的 resolve/reject,同时处理超时和权限拒绝等常见失败场景。
基础封装:支持成功与错误回调
Geolocation API 原生使用回调,Promise 封装后可配合 async/await 或 .then() 使用,代码更清晰:
- 调用
getCurrentPosition,成功时调用resolve,传入position对象 - 失败时(如用户拒绝、定位不可用)调用
reject,传入原生error对象,含code和message - 注意:不要直接返回
position.coords,保留完整position结构,方便后续获取时间戳等信息
加入超时控制:避免长时间等待
浏览器默认不提供超时机制,但用户可能处于无 GPS、飞行模式或信号弱环境,容易卡住。建议手动加 timeout:
- 用
Promise.race并行运行定位请求和定时器 - 例如设置 8 秒超时,超时后 reject 并清理
getCurrentPosition的 pending 状态(虽然无法真正取消,但可避免后续回调触发) - 注意:
timeout错误应区分于权限错误(code=1)或位置不可用(code=2),便于针对性提示用户
可选配置项:复用性和兼容性考虑
封装时暴露 options 参数,比如 { enableHighAccuracy: true, timeout: 10000, maximumAge: 30000 }:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
-
enableHighAccuracy请求高精度定位(可能更慢、更耗电),按需开启 -
maximumAge允许返回缓存的位置(单位毫秒),适合对实时性要求不高的场景 - 将
options直接透传给原生 API,保持行为一致,不额外做校验或转换
实际调用示例:简洁且健壮
封装后使用非常直观,错误可统一捕获:
async function getLocation() {
try {
const position = await getGeolocation({ timeout: 6000 });
console.log('纬度:', position.coords.latitude);
console.log('经度:', position.coords.longitude);
} catch (err) {
switch (err.code) {
case 1: console.error('用户拒绝了位置权限'); break;
case 2: console.error('位置不可用'); break;
case 3: console.error('请求超时'); break;
default: console.error('未知错误:', err.message);
}
}
}
不复杂但容易忽略细节。

















