为什么我的地理编码功能返回未定义?

时间:2019-09-02 20:25:24

标签: javascript function return

我使用Google Geocoding API对我的地址进行地理编码,例如从“地址150,城市”到纬度和经度。在函数的最后,我试图返回一个对象,其中包含这两个对象,如下面的代码所示。

我认为问题可能是,编码需要花费一些时间,并且由于我今天想解决此问题,而且我还没有学会使用promise和东西进行等待和异步(我会这样做,不用担心),我改为使用setTimeout,但是即使在编码完成后以为我正在调用console.log,它也无法解决问题。由于我是JS的新手,所以我只是尝试将其包装到变量中,只使用一些代码,但都没有帮助。

            // address
            var address = "Address 156, City"
            function geocode(address) {
                axios.get("https://maps.googleapis.com/maps/api/geocode/json", {
                    params: {
                        address: address,
                        key: "AIzaSyDaXOpbCeLYeRxWXtuSQQEbQzR14PejczM"
                    }
                })
                    .then((response) => {
                        let lngLat = {
                            lat: response.data.results[0].geometry.location.lat,
                            lng: response.data.results[0].geometry.location.lng}
                        console.log(lngLat) // here it shows me my object
                        return lngLat;
                    })
            }
            let geocodedAddress = geocode(address);
            setTimeout(function () { console.log(geocodedAddress); }, 3000);               
        }
    });

2 个答案:

答案 0 :(得分:1)

您的函数中没有returnreturn中的then()不会返回外部函数。

此外,该请求是异步的,因此您需要返回axios.get承诺,并在调用函数时使用另一个then()访问数据

function geocode(address) {
  // return the promise
  return axios.get("https://maps.googleapis.com/maps/api/geocode/json", {
      params: {
        address: address,
        key: "AIzaSyDaXOpbCeLYeRxWXtuSQQEbQzR14PejczM"
      }
    })
    .then((response) => {
      let lngLat = {
        lat: response.data.results[0].geometry.location.lat,
        lng: response.data.results[0].geometry.location.lng
      };     
      return lngLat;
    });
}

// usage
geocode(address).then(lngLat => {
  console.log(lngLat);
});

答案 1 :(得分:0)

好吧,我无法访问您的整个代码,但是采用异步/等待方法来解决您的问题,您将是:

// address
var address = "Address 156, City"
async function geocode(address) {
  const response = await axios.get("https://maps.googleapis.com/maps/api/geocode/json", {
    params: {
      address: address,
      key: "AIzaSyDaXOpbCeLYeRxWXtuSQQEbQzR14PejczM"
    }
  })

  let lngLat = {
    lat: response.data.results[0].geometry.location.lat,
    lng: response.data.results[0].geometry.location.lng
  }
  console.log(lngLat) // here it shows me my object
  return lngLat; 
}

let geocodedAddress = await geocode(address);
console.log(geocodedAddress);               
}
});

请注意,异步/等待如何使您能够编写简单的顺序逻辑来执行异步操作。