2017-06-08 1 views
3

Wie kann ich den Geolocation-spezifischen Fehler abfangen, um den Benutzer darüber zu informieren, dass Geolocation aktiviert sein muss?Catch Geolocation Error - Async Warten

Der Catch protokolliert einen Fehler namens PositionError wie hier in der Mozilla-Dokumentation "https://developer.mozilla.org/en-US/docs/Web/API/PositionError" verwiesen.

* Anmerkung: mein Code nicht den Fehler abzufangen, es zeigt einfach:

Uncaught (in promise) ReferenceError: PositionError is not defined 

-Code

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 rate PositionError ist dem Browser nicht bekannt (aber "anonym" von getCUrrentPosition zurückgegeben). Sie könnten stattdessen 'Object.prototype.toString.call (error) === '[object PositionError]'' überprüfen. – Fabian

+1

'async/await' ist Teil von ** ES2017 **, nicht ES7. –

Antwort

2

Die getCurrentPosition() API wurde schlecht konzipiert, vorausgesetzt, Benutzer-Fehler testen würde sofort in der Rückruf, anstatt sie zu verschenken.

Da PositionError keinen öffentlichen Konstruktor hat, ist window.PositionError nicht definiert.

Wie Fabian in den Kommentaren erwähnt, können Sie für den Fehler wie folgt testen:

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

oder seine Version verwenden, wenn Sie eine API wahrscheinlich sind Aufruf nicht-Objekt Fehler werfen (hoffentlich selten).

Anstatt jedoch den Code von Littering, empfehle ich stattdessen einen besseren Fehler von Ihrem neu Asynchron getCurrentLocation() API werfen (fiddle verwenden um SO-Code-Snippet-Sandbox zu bekommen):

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