2017-01-04 3 views
0

Die getLocation() Funktion, die Standort in 3 Versuchen abrufen sollte, gibt stattdessen zurück. navigator.geolocation.getCurrentPosition() gibt die korrekte Position zurück, aber das Problem liegt in der Verarbeitung von Versprechen.JS Versprechen innerhalb des Versprechens

Das Problem ist anscheinend, dass ich ein Versprechen innerhalb des Versprechens nenne. Ich darf das Schlüsselwort await nicht innerhalb von geolocate() verwenden, das bereits als async deklariert ist.

Original-Aufruf:

var getLocationPromise = this.getLocation(); 
// Do something... 
location = await getLocationPromise; 

getLocation():

async getLocation() { 
    return new Promise((resolve, reject) => { 
     var geolocate; 
     for (let i=0; i<3; i++) { 

     geolocate = this.geolocate(); 

     try { 
      var location = geolocate;//CAN'T USE AWAIT INSIDE ASYNC... 
      resolve(location); 
     } catch(err) { 
      continue; 
     } 
     } 
     reject("Max geolocation attempts"); 
    }); 
    } 

geolocate():

async geolocate() { 
    return new Promise((resolve, reject) => { 

     navigator.geolocation.getCurrentPosition(
     (position) => { 
      resolve(position); 
     }, 
     (err) => { 
      reject(err); 
     }, 
     {enableHighAccuracy: true, timeout: 20000, maximumAge: 1000} 
    ); 
    }); 
    } 
+1

'erwarten getLocation (bis kombiniert und vereinfacht werden). dann(); '===' erwarten getLocation(); '- nicht wahr? –

+0

Es gibt andere Ergebnisse. Ich hatte Probleme mit 'erwarten getLocation();' 'undefined' zurückgeben, so verwende ich' erwarten getLocation(). Then(); 'das scheint sicherer –

+0

nicht sicher, warum Sie' async' auf 'geolocate' und' getLocation' verwenden - da keine dieser Funktionen "erwarten" –

Antwort

2

Solange die folgende ist in einer Funktion Asynchron

erklärt
var getLocationPromise = this.getLocation(); 
// Do something... 
location = await getLocationPromise; 

sollte es in Ordnung sein, wie

bei getLocation/Geolokalisieren suchen, es sei denn Sie eine separate Geolokalisieren Methode benötigen, sollten sie in der Lage sein

getLocation() { 
    var geolocate =() => 
     new Promise((resolve, reject) => 
      navigator.geolocation.getCurrentPosition(resolve, reject, { 
       enableHighAccuracy: true, 
       timeout: 20000, 
       maximumAge: 1000 
      }); 
     ); 
    // this function will "retry" the supplied function (fn) cont times 
    var limitedPromiseRetry = (fn, cont) => fn().catch(err => cont > 0 ? limitedPromiseRetry(fn, cont-1) : Promise.reject('Max number of geolocation attempts')); 
    return limitedPromiseRetry(geolocate, 3); 
} 
+0

Schöne und kompakte Lösung, vermeidet das doppelte Versprechen. Aus Ihrer Antwort verstehe ich, dass das Versprechen innerhalb des Versprechens keine gute Idee ist und nicht unterstützt wird? –

+0

nein, es wird unterstützt, es ist in diesem Fall einfach nicht erforderlich –

Verwandte Themen