【问题标题】:Why does my geocoding function return undefined? [duplicate]为什么我的地理编码函数返回未定义? [复制]
【发布时间】:2019-09-02 20:25:24
【问题描述】:

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

我认为问题可能是,编码需要相当长的时间,因为我今天想解决这个问题,但我还没有学习 await 和 async with promises 和东西(我明天会做,别担心),我改用 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);               
        }
    });

【问题讨论】:

  • 只需在调用 `return lngLat;` 的地方进行实际工作 - 承诺不会返回那样的值。
  • @EvanKnowles 有时我倾向于过于复杂。感谢您解决我的问题:)

标签: javascript function return


【解决方案1】:

您的函数中没有returnthen() 中的 return 不会返回到外部函数。

另外,请求是异步的,所以你需要在函数被调用时返回axios.getpromise并使用另一个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);
});

【讨论】:

    【解决方案2】:

    好吧,我无权访问您的整个代码,但您可以使用异步/等待方法来解决您的问题:

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

    注意 async/await 如何让您编写简单的顺序逻辑来执行异步操作。

    【讨论】:

    • 需要另一个异步函数来做let geocodedAddress = await geocode(address);
    • 这是真的,但我假设没有理由其他函数也不能是async
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2017-05-19
    • 2014-06-04
    • 1970-01-01
    相关资源
    最近更新 更多