节点js在方法中承诺

时间:2016-07-31 01:49:28

标签: node.js promise

我是asynch编程的新手,我无法理解Promises。我正在尝试使用反向地理编码库,其中lat / long被发送到Google Maps并返回详细说明该位置的json。

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;
    }

当我致电geolocator.getLocationId时,我得到undefined。我猜测方法调用退出并返回undefined。封装承诺的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

就像@smarx所说,你会在Promise返回getLocationId()并执行then分支:

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
  })