0

node.jsのgoogleジオコーディングAPIを使用してgeodataという変数を作成して返す関数を作成しようとしています。何らかの理由で値のtempは私が望む結果を持っていますが、私が関数の外でiを使うと、tempの値は定義されていません。Node.jsのGoogleジオコーディングAPIの結果を返す方法

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

非同期コードは非同期です –

+0

私は約束を使用できますか?それが助けになるだろうか?私はそれらを使用する方法を学ぼうとしていますが、私は自分の時間を無駄にしているかどうかを知りたいです –

+0

約束は助けにならないでしょう。非同期のコードが何かではない場合、助けて。しかし、次のasync/awaitの進化により、非同期コードを同期させることができますが、まだ非同期で正しく動作させる方法を知る必要があります。非同期タスクを同期的に動作させるための魔法の弾丸は不可能です。 –

答えて

0

あなたの関数は非同期であるべきであり、あなたはそれがこのように、約束またはasync /のawaitを使って作ることができます。

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

は、あなたはそれを動作させるために、単純なコールバックを使用することができます。私はまた、いくつかのバグを修正しました。ここにあなたのコードの実用版があります。

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); 
    } 
}); 
関連する問題