2017-01-19 3 views
0

Ich verwende Node.js. Ich habe eine Funktion namens locationToAddress erstellt, die aber immer undefiniert zurückgibt. Dies ist der Code vereinfacht:JavaScript: Funktionsrückgabe ist nicht definiert

<FORMATTED_ADDRESS> 
<FORMATTED_ADDRESS> 

Aber ich sehe:

undefined 
<FORMATTED_ADDRESS> 

Ich weiß, dass der Fehler bei der Rückkehr ist

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

in der Konsole sollte dieser Code wie zu sehen ist Der Wert funktioniert einwandfrei, wenn ich die Funktion ohne Protokollierung der Rückgabe aufruft.

+0

Wie Sie durch die Reihenfolge der Ausgabe sehen können, die Funktion * vor * gibt die Antwort empfangen wurde. 'request' ist asynchron. * Rückgabe * ein Wert ist immer synchron. –

Antwort

0

Es ist, weil locationToAddress nichts zurückgibt. Die return addressString; und return 'Could not find address'; sind nicht "Teil" von locationToAddress.

Da die Anforderung in den locationToAddress ist asynchron ich wette, dass Sie die Funktion mit einer anderen Signatur verwenden wollten:

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

Dann in den request(url, function (error, response, body) { werden Sie nicht return verwenden, sondern callback(null, addressString) und callback('Could not find address'). Das erste Argument in der callback ist immer Fehler und prägnante sind die Daten, die Sie zurückgeben möchten.

Beachten Sie, dass in NodeJS der meiste Code asynchron ist und Sie als solcher umgehen müssen. Um Ihren Code synchron aussehen zu lassen, werfen Sie einen Blick auf async.js. Die Funktion, die ich alle Male verwende, sind series, waterfall und autoInject.

* Komplette Überarbeitung mit einem Rückruf *

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

Es tut, die Zeile "return addressString" tut das. –

+0

@PaulBentley - Diese Zeile ist nicht Teil der Funktion 'locationToAddress'. – Quentin

+0

@PaulBentley: Diese Zeile befindet sich in der Funktion, die Sie an 'request' übergeben, nicht an' locationToAddress'. 'return'-Anweisungen überschreiten keine Funktionsgrenzen. Hier ein vereinfachtes Beispiel: 'function foo() {Funktionsleiste() {return 42; }; Bar(); zurück 21; }; 'Was glaubst du,' foo' kehrt zurück? –

Verwandte Themen