2017-01-19 172 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'返回什麼? –