在jquery函数中返回未定义的值

时间:2012-06-07 13:11:02

标签: jquery jquery-mobile

我使用此代码计算两个gps位置之间的距离。问题是当我返回计算值时,它返回未定义的值。请帮帮我

function calcDistane(offerID,userLocation){
    var dist;
    var adapter = new LocationAdapter();

    adapter.selectByOfferId(offerID,function(res){                       

    navigator.geolocation.getCurrentPosition(function(position){

        var R = 6371;
        var userLocation= position.coords;

        dist= Math.acos(Math.sin(userLocation.latitude)*Math.sin(res.item(0).lt) + 
              Math.cos(userLocation.latitude)*Math.cos(res.item(0).lt) *
              Math.cos(userLocation.longitude-res.item(0).lg)) * R;
        });

    });  
    return dist;
};

1 个答案:

答案 0 :(得分:2)

当你回来时,

dist尚未设定。设置dist的功能是回调。从外部(回调)函数返回后,很可能会调用它。

可能的执行顺序是

  1. adapter.selectByOfferId
  2. return dist(undefined)
  3. 调用匿名函数,用作对adapter.selectByOfferId
  4. 的回调
  5. 调用navigator.geolocation.getCurrentPosition并从步骤3的回调中返回
  6. 当navigator.geolocation.getCurrentPosition返回时,调用该调用的回调并设置dist。这是在第2步之后
  7. 您需要传递延续而不是返回

    function calcDistane(offerID,userLocation,callback){
      var adapter = new LocationAdapter();
    
      adapter.selectByOfferId(offerID,function(res){                       
    
            navigator.geolocation.getCurrentPosition(function(position){
    
                   var R = 6371;
                   var userLocation= position.coords;
    
                   callback(Math.acos(Math.sin(userLocation.latitude)*Math.sin(res.item(0).lt) + 
                            Math.cos(userLocation.latitude)*Math.cos(res.item(0).lt) *
                            Math.cos(userLocation.longitude-res.item(0).lg)) * R);
    
           });
    
      });
    }