2017-06-08 48 views
3

ジオロケーションに固有のエラーをキャッチして、ジオロケーションがオンになっている必要があることをユーザーに通知するにはどうすればよいですか?Catch Geolocation Error - Async Await

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') 
     } 
    } 
} 
+0

I PositionErrorはブラウザには知られていないと推測されます(ただし、getCUrrentPositionによって返される「匿名」)。代わりに 'Object.prototype.toString.call(error)=== '[object PositionError]'をチェックすることができます。 – Fabian

+1

'async/await'はES7ではなく** ES2017 **の一部です。 –

答えて

2

getCurrentPosition() APIが悪いユーザーは、直ちにエラーをテストするだろうと仮定し、設計されましたコールバックを渡すのではなく、

PositionErrorにはpublicコンストラクタがないため、window.PositionErrorは定義されていません。

if (e.toString() == '[object PositionError]') { 
    console.log('position error') 
} 

をしたり、非オブジェクトのエラーをスローする可能性が高い任意のAPI(うまくいけばレア)を呼び出している場合は、彼のバージョンを使用します。

ファビアンはコメントで言及したように、このようなエラーのためにテストすることができます。

しかし、代わりにあなたのコードをポイ捨ての、私が代わりにあなたの新しい非同期getCurrentLocation() APIからより良いエラーを投げるお勧めします(周りのSOコードスニペットサンドボックスを取得するためにfiddleを使用):

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