2016-07-31 16 views
0

Ich bin neu in asynch Programmierung und ich kann Versprechen nicht verstehen. Ich versuche eine umgekehrte Geocodierungsbibliothek zu verwenden, in der lat/long an Google Maps gesendet wird und ein json, der den Ort detailliert angibt, zurückgegeben wird.Knoten js Versprechen in einer Methode

class Geolocator 
{ 
    constructor() 
    { 
     let options = { 
      provider: 'google', 
      httpAdapter: 'https', 
      apiKey: mapsKey, 
      formatter: null 
     }; 

     this._geocoder = NodeGeocoder(options); 
    } 

    getLocationId(lat, lon) 
    { 
     this._geocoder.reverse({lat: lat, lon: lon}) 
      .then(function(res) { 
       return this._parse(null, res); 
      }) 
      .catch(function(err) { 
       return this._parse(err, null); 
      }); 
    } 

    _parse(err, res) 
    { 
     if (err || !res) 
      throw new Error(err); 
     return res; 
    } 

Als ich geolocator.getLocationId nennen bekomme ich undefined. Ich vermute, dass der Methodenaufruf beendet wird und undefined zurückgibt. Was ist der beste Weg, das Versprechen zu kapseln?

+0

'getLocationId' gibt undefined zurück, weil Sie nichts zurück. Wenn Sie das Ergebnis des Anrufs, den Sie gerade machen, zurückgeben möchten, setzen Sie eine "return" davor. – smarx

+0

@smarx Ich habe das versucht, es gibt ein Promise-Objekt zurück. Nicht die Antwort. – mrQWERTY

+0

Nun, es kann die Antwort nicht zurückgeben ... die Antwort existiert noch nicht. Sie müssen ".then" auf der Promise aufrufen und eine Funktion übergeben, um mit der Antwort aufgerufen zu werden. – smarx

Antwort

1

Wie @smarx sagte, würden Sie die Promise bei getLocationId() zurückkehren und führen then Zweig:

class Geolocator { 
    // ... 

    /* returns a promise with 1 argument */ 
    getLocationId(lat, lon) { 
    return this._geocoder.reverse({ lat, lon }) 
    } 
} 


// calling from outside 
geolocator 
    .getLocationId(lat, lon) 
    .then((res) => { 
    // whatever 
    }) 
    .catch((err) => { 
    // error 
    })