0

このコードを使用して、2つの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;
};
4

1 に答える 1

2

dist戻るときはまだ設定されていません。dist を設定している関数はコールバックです。これは、外部 (コールバック) 関数から戻った後に呼び出される可能性が非常に高くなります。

実行の可能性のある順序は次のとおりです。

  1. adapter.selectByOfferId
  2. 戻り値 (未定義)
  3. adapter.selectByOfferId へのコールバックとして使用される無名関数を呼び出す
  4. navigator.geolocation.getCurrentPosition を呼び出し、手順 3 のコールバックから戻ります
  5. navigator.geolocation.getCurrentPosition が返されると、その呼び出しのコールバックが呼び出され、dist が設定されます。ステップ2の後です

戻るのではなく、継続を渡す必要があります

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

       });

  });
}
于 2012-06-07T13:14:40.933 に答える