【问题标题】: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。

标签: javascript geolocation async-await ecmascript-2017


【解决方案1】:

getCurrentPosition() API 设计不佳,假设用户会在回调中立即测试错误,而不是传递错误。

由于PositionError 没有公共构造函数,所以window.PositionError 没有定义。

正如 Fabian 在 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

【讨论】:

    猜你喜欢
    • 2019-02-11
    • 2018-07-29
    • 2018-04-20
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2018-04-06
    相关资源
    最近更新 更多