0

Ich versuche eine Funktion zu erstellen, die die Google Geocoding API für node.js verwendet, um eine Variable namens Geodaten zu erstellen und sie zurückzugeben. Aus irgendeinem Grund hat der Wert temp das gewünschte Ergebnis, aber wenn ich i außerhalb der Funktion verwende, ist der Wert von temp nicht definiert.Wie gibst du das Ergebnis von der Google Geocoding API auf Node.js zurück

var temp; 
function getInfo(inAddress){ 
    googleMapsClient.geocode({ 
    address: inAddress, 
    region: 'MY' 
    }, function(err, response) { 
    if (!err) { 
     details = response.json.results; 
     var geodata = { 
     "status": response.json.status, 
     "formattedAddress": details[0].formatted_address, 
     "latitude": details[0].geometry.location.lat, 
     "longitude": details[0].geometry.location.lng, 
     "type": details[0].geometry.location_type, 
     }; 
     for(i=0; details[0].address_components.length; i++){ 
     if(details[0].address_components[i].types == "postal_code"){ 
      geodata.postCode = details[0].address_components[i].long_name; 
     } 
     temp = geodata 
     console.log(temp); 
     } 
    } 
    }); 
} 

getInfo('Nadayu28'); 
+0

asynchroner Code ist asynchron –

+0

kann ich ein Versprechen verwenden? Würde das helfen? Ich versuche zu lernen, wie man sie benutzt, aber ich will wissen, ob ich nur meine Zeit verschwenden werde. –

+0

Versprechungen werden nicht helfen, sie sind auch asynchron, also wenn asynchroner Code nicht etwas ist, mit dem man weiß, wie man damit arbeitet, verspricht es nicht Hilfe. Die nächste Entwicklung von ihnen, async/await, kann dazu führen, dass asynchroner Code synchron aussieht, aber Sie müssen immer noch wissen, wie Sie mit Asynchronität arbeiten, um sie richtig zu verwenden ... Sie verschwenden keine Zeit, hören einfach auf zu suchen für eine magische Kugel, um asynchrone Aufgaben synchron arbeiten zu lassen - es ist unmöglich –

Antwort

0

Ihre Funktion sollte asynchron sein, und man kann es verspricht oder Asynchron mit make/await, wie folgt aus:

const Promise=require('bluebird'); 

async function getInfo(inAddress){ 
    return Promise.promisify(googleMapsClient.geocode)({ 
    address: inAddress, 
    region: 'MY' 
    }).then((response)=> { 
     details = response.json.results; 
     var geodata = { 
     "status": response.json.status, 
     "formattedAddress": details[0].formatted_address, 
     "latitude": details[0].geometry.location.lat, 
     "longitude": details[0].geometry.location.lng, 
     "type": details[0].geometry.location_type, 
     }; 
     for(i=0; details[0].address_components.length; i++){ 
     if(details[0].address_components[i].types == "postal_code"){ 
      geodata.postCode = details[0].address_components[i].long_name; 
     } 
     return geodata; 
     } 
    } 
    }); 
} 

const data = await getInfo('Nadayu28'); 
0

Sie können einen einfachen Rückruf verwenden, damit es funktioniert. Ich habe auch einige Bugs behoben. Hier ist die funktionierende Version Ihres Codes.

var googleMapsClient = require('@google/maps').createClient({ 
    key: 'Your Key' 
}); 

function getInfo(inAddress, callback) { 
    googleMapsClient.geocode({ 
     address: inAddress, 
     region: 'MY' 
    }, function(err, response) { 
     if (!err) { 
      details = response.json.results; 
      var geodata = { 
       "status": response.json.status, 
       "formattedAddress": details[0].formatted_address, 
       "latitude": details[0].geometry.location.lat, 
       "longitude": details[0].geometry.location.lng, 
       "type": details[0].geometry.location_type, 
      }; 
      for (i = 0; i < details[0].address_components.length; i++) { 
       if (details[0].address_components[i].types.indexOf("postal_code") !== -1) { 
        geodata.postCode = details[0].address_components[i].long_name; 
       } 
      } 

      callback(null, geodata); 
     } else { 
      callback(err, null); 
     } 
    }); 
} 

getInfo('Nadayu28', function(err, response) { 
    if (err) { 
     console.error(err); 
    } else { 
     console.log(response); 
    } 
}); 
Verwandte Themen