捕获地理位置错误 - 异步等待

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/awaitES2017 的一部分,而不是 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

【讨论】:

以上是关于捕获地理位置错误 - 异步等待的主要内容,如果未能解决你的问题,请参考以下文章

快速错误处理和异步等待

将 Node.js 流错误事件传播到异步等待样式代码

捕获回调函数引发的错误

异步等待不等待完成

处理 Mongoose 异步/等待调用中的错误

地理位置未捕获类型错误:无法读取未定义的属性“坐标”