2017-01-19 11 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

あなたは、出力の順番で見ることができるように、機能は前に*を返す*応答が受信されました。 '要求 'は非同期です。 *値を返す*は常に同期します。 –

答えて

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の第1引数は常にエラーで、簡潔なものは返すデータです。

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:その行は 'locationToAddress'ではなく' request'に渡す関数の中にあります。 'return'文は関数の境界を越えません。以下に簡単な例を示します: 'function foo(){function bar(){return 42; };バー();リターン21; }; '' foo'は何を返すと思いますか? –

関連する問題