【问题标题】:Function returning undefined [duplicate]返回未定义的函数[重复]
【发布时间】:2015-12-26 12:49:54
【问题描述】:

我正在尝试创建一个简单的函数来根据浏览器返回用户位置,但它一直返回未定义:

  function getLocation() {
    //get current location
    var geo_param;
    if(navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(function(position) {
        // Create geolocation parameter
        geo_param = "geolocation=[" + position.coords.latitude + "," + position.coords.longitude + "]";
        console.log(geo_param)
      });
    }
    return geo_param
  }

  function search(activity) {
    var searchUrl = "/s?activity=" + activity + "&" + getLocation()
    window.location.href = searchUrl;
    console.info(searchUrl)
  }

【问题讨论】:

  • 如果getCurrentPostion是异步的,你会得到未定义的返回。
  • 如果getCurrentPosition是异步的,那么函数将返回geo_param BEFORE getCurrentPosition中的回调被调用

标签: javascript jquery return


【解决方案1】:

getCurrentPosition 作用域是异步的,所以geo_param 将在 getCurrentPosition 完成运行之前返回。对此的解决方案是使用回调,请参见下面的示例。

 function getLocation(callback, activity) {
     //get current location
     var geo_param;
     if (navigator.geolocation) {
         navigator.geolocation.getCurrentPosition(function (position) {
             // Create geolocation parameter
             geo_param = "geolocation=[" + position.coords.latitude + "," + position.coords.longitude + "]";
             console.log(geo_param);
             callback(geo_param, activity);
         });
     }
 }

 function search(activity) {
     getLocation(search_with_current_location, activity);
 }

 function search_with_current_location(geo_param, activity) {
     var searchUrl = "/s?activity=" + activity + "&" + geo_param;
     window.location.href = searchUrl;
     console.info(searchUrl);
 }

【讨论】:

    【解决方案2】:

    在这种情况下,您的函数在获取响应之前执行。收到API的回复后,需要有回调函数。

    另请注意,您在重定向 URL 中没有 query string key geo_param

    试试这个:

    function getLocation(cb) {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(function (position) {
                var geo_param = "geolocation=[" + position.coords.latitude + "," + position.coords.longitude + "]";
                if (typeof cb === 'function') {
                    cb(geo_param);
                }
            });
        }
    }
    function search(activity) {
        getLocation(function (geo_param) {
            window.location.href = "/s?activity=" + activity + "&" + geo_param;
        });
    }
    

    【讨论】:

    • 您好,谢谢您的回答。我确实有查询字符串键,但是它被称为地理位置。所以它看起来像 '&geolocation=[lon,lat]` 你有它的方式会返回&geo_param=geolocation=[lon,lat]
    • @蝙蝠侠,哦,是的!我错了..
    • 但是它工作得很好。非常感谢,我想我现在明白了。所以为了保存异步函数的结果,我需要将它传递给另一个函数并从那里使用它。
    • 没错!对于 async 操作,因为函数是一等对象,我们可以将函数作为参数传递给另一个函数,然后执行传入的函数,甚至返回它以供稍后执行。
    • 啊,好吧,我明白了,有点混乱,但我明白。感谢您的帮助
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多