2017-01-19 39 views
0

我正在使用Node.js.我创建了一个叫做locationToAddress的函数,但它总是返回undefined。这是简化了代码:JavaScript:函数返回值未定义

var lat = '-34.491093'; 
var long = '-58.558597'; 

console.log(locationToAddress(lat, long)); 

function locationToAddress(lat, long) { 
    var preUrl = 'https://maps.googleapis.com/maps/api/geocode/json?latlng='; 
    var apiKey = '<API_KEY>'; 

    var url = preUrl + lat + ',' + long + apiKey; 

    var addressString = ''; 

    request(url, function (error, response, body) { 
     try { 
      var jsonLocationObject = JSON.parse(body); 
      addressString = JSON.stringify(jsonLocationObject.results[0].formatted_address); 
      addressString = addressString.replace(/["]/g, ''); 
      console.log(addressString); 
      return addressString; 
     } catch (e) { 
      return 'Could not find address'; 
     } 
    }); 
} 

在控制台中,此代码应被视为:

<FORMATTED_ADDRESS> 
<FORMATTED_ADDRESS> 

但我看到:

undefined 
<FORMATTED_ADDRESS> 

我知道错误是在返回的价值,因为它完美的工作,如果我没有记录返回调用函数。

+0

你可以通过输出的顺序看,该函数返回前* *收到的响应。 'request'是异步的。 *返回*一个值总是同步的。 –

回答

0

这是因为locationToAddress不返回任何东西。 return addressString;return 'Could not find address';不是locationToAddress的“部分”。

因为在locationToAddress请求是异步我敢打赌,你想使用的功能有不同的签名:

function locationToAddress(lat, long, callback) { // see the param 'callback' 

然后在request(url, function (error, response, body) {你不会用return而是callback(null, addressString)callback('Could not find address')callback中的第一个参数总是错误的,简洁的是您想要返回的数据。

请注意,在NodeJS中,大部分代码都是异步的,您必须像这样处理它。要使您的代码看起来同步,请查看async.js。我一直使用的功能是series,waterfallautoInject

*完全重写了回调*

function locationToAddress(lat, long, callback) { // <--- CHANGE 
    var preUrl = 'https://maps.googleapis.com/maps/api/geocode/json?latlng='; 
    var apiKey = '<API_KEY>'; 

    var url = preUrl + lat + ',' + long + apiKey; 

    var addressString = ''; 

    request(url, function (error, response, body) { 
     try { 
      var jsonLocationObject = JSON.parse(body); 
      addressString = JSON.stringify(jsonLocationObject.results[0].formatted_address); 
      addressString = addressString.replace(/["]/g, ''); 
      console.log(addressString); 
      return callback(null, addressString); // CHANGE - null represents "no error" 
     } catch (e) { 
      return callback('Could not find address'); // CHANGE - nonnull 1st param means an error occured 
     } 
    }); 
} 
+0

它的确如此,“return addressString”这样做。 –

+0

@PaulBentley - 该行不是'locationToAddress'函数的一部分。 – Quentin

+0

@PaulBentley:该行在传递给'request'的函数中,而不在'locationToAddress'中。 'return'语句不会跨越函数边界。这是一个简化的例子:'function foo(){function bar(){return 42; };酒吧();返回21; };'你觉得'foo'返回什么? –