捕获地理位置错误 - 异步等待
Posted
技术标签:
【中文标题】捕获地理位置错误 - 异步等待【英文标题】:Catch Geolocation Error - Async Await 【发布时间】:2017-11-09 16:58:59 【问题描述】:如何捕获特定于地理位置的错误以通知用户他们必须打开地理位置?
catch 记录了一个名为 PositionError 的错误,如 Mozilla 文档“https://developer.mozilla.org/en-US/docs/Web/API/PositionError”中所述。
*注意:我的代码没有捕捉到错误,它只是显示:
Uncaught (in promise) ReferenceError: PositionError is not defined
代码
getCurrentLocation()
return new Promise((resolve, reject) =>
navigator.geolocation.getCurrentPosition(resolve, reject,
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
);
);
,
async inout()
try
let location = await this.getCurrentLocation();
let response = await axios.post(API.URL, );
catch (e)
if(e instanceof PositionError)
console.log('position error')
【问题讨论】:
我猜浏览器不知道 PositionError(但 getCUrrentPosition 返回“匿名”)。您可以改为检查Object.prototype.toString.call(error) === '[object PositionError]'
。
async/await
是 ES2017 的一部分,而不是 ES7。
【参考方案1】:
getCurrentPosition()
API 设计不佳,假设用户会在回调中立即测试错误,而不是传递错误。
由于PositionError
没有公共构造函数,所以window.PositionError
没有定义。
正如 F*** 在 cmets 中提到的,您可以像这样测试错误:
if (e.toString() == '[object PositionError]')
console.log('position error')
如果您调用任何可能引发非对象错误的 API(希望很少见),请使用他的版本。
但是,我建议不要乱扔代码,而是从新的异步 getCurrentLocation()
API 中抛出更好的错误(使用 fiddle 绕过 SO 代码 sn-p 沙箱):
function getCurrentLocation(options)
return new Promise((resolve, reject) =>
navigator.geolocation.getCurrentPosition(resolve, (code, message) =>
reject(Object.assign(new Error(message), name: "PositionError", code)),
options);
);
;
async function inout()
try
console.log(await this.getCurrentLocation(
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
));
catch (e)
if (e.name == 'PositionError')
console.log(e.message + ". code = " + e.code);
inout().catch(e => console.log(e)); // User denied geolocation prompt. code = 1
【讨论】:
以上是关于捕获地理位置错误 - 异步等待的主要内容,如果未能解决你的问题,请参考以下文章