这个函数是异步的,在这种情况下这是我的大多数问题。
我想获取当前位置的当前经度和纬度,以便我可以在distanceFromCurrent
函数中使用这些来计算当前位置与给定georss
点之间的距离。
除了我不能在其异步函数之外使用currLat
和currLong
这一事实外,一切正常。
function getCurrentPosition(){
navigator.geolocation.getCurrentPosition(getCoords, getError);
}
function getCoords(position){
var currLat = position.coords.latitude;
var currLon = position.coords.longitude;
}
function getError(error) {
alert("Error");
}
// convert degrees to radians
Number.prototype.toRad = function()
{
return this * Math.PI / 180;
}
这是一个计算与georss
之间的距离以及当前纬度和经度的函数,它与目前设定的lat / lng一样正常。
function distanceFromCurrent(georss)
{
getCurrentPosition();
var currLat = 3.0;
var currLon = 4.0;
georss = jQuery.trim(georss);
var pointLatLon = georss.split(" ");
var pointLat = parseFloat(pointLatLon[0]);
var pointLon = parseFloat(pointLatLon[1]);
var R = 6371; //Radius of the earth in Km
var dLat = (pointLat - currLat).toRad(); //delta (difference between) latitude in radians
var dLon = (pointLon - currLon).toRad(); //delta (difference between) longitude in radians
currLat = currLat.toRad(); //conversion to radians
pointLat = pointLat.toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(currLat) * Math.cos(pointLat);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); //must use atan2 as simple arctan cannot differentiate 1/1 and -1/-1
var distance = R * c; //sets the distance
distance = Math.round(distance*10)/10; //rounds number to closest 0.1 km
return distance; //returns the distance
}
那么,是否有人有想法/解决方案可能会以不同的方式获得这种方式,或者我是否会完全错误?
答案 0 :(得分:0)
在distanceFromCurrent函数中添加参数,并在你的回调中调用它,其中georss是一个全局变量:
var georss = "43.12 7.12";
function getCoords(position){
var currLat = position.coords.latitude;
var currLon = position.coords.longitude;
var distance = distanceFromCurrent(lat, lon, georss);
}
和
function distanceFromCurrent(georss, currLat, currLon){
// getCurrentPosition();
// var currLat = 3.0;
// var currLon = 4.0;
georss = jQuery.trim(georss);
var pointLatLon = georss.split(" ");
//....
答案 1 :(得分:0)
如果以下呼叫无阻塞,那么这根本不起作用。
navigator.geolocation.getCurrentPosition(getCoords, getError);
调用this的方式意味着getCurrentPosition()的结果在到达distanceFromCurrent()方法结束之前不会完成。
相反,您可以执行以下操作并调用update()而不是distanceFromCurrent()。这将最终使用当前的lat / lng值调用distanceFromCurrent()方法。
注意:以下是伪代码,我怀疑它会正确传递你的georss值。
update()
{
getCurrentPosition();
}
function getCurrentPosition(){
navigator.geolocation.getCurrentPosition(getCoords, getError);
}
function getCoords(position){
var currLat = position.coords.latitude;
var currLon = position.coords.longitude;
distanceFromCurrent(georss, lat, lng);
}
function distanceFromCurrent(georss, lat, lng)
{
// Remove -> getCurrentPosition();
var currLat = lat;
var currLon = lng;
georss = jQuery.trim(georss);
...
}
答案 2 :(得分:-1)
getCorrentPosition是异步的。 作为第一个参数,您需要发送指向将使用数据的函数的指针。 实施例
navigator.geolocation.getCurrentPosition(function(position) {
var latitude = position.coords.latitude
var longitude = position.coords.longitude;
distanceFromCurrent(currLatitude, currLongitude, latitude, longitude);
});
这应该是你开始的好方法。
问题是你试图以错误的方式解决问题。您应该调用getCurrentPosition并处理其中的所有返回数据。 也许这样的事情(对你的功能进行一些改变)可以做到这一点。
请记住,javascript永远不会睡觉(没有睡眠)所以所有不能“现在”完成的事情都需要推迟。这就是这种方法的情况。您需要考虑将回调发送到函数而不是返回。因为我没有你所有的代码,所以我不知道如何改造它。但基本上你需要:
function distanceFromCurrent(georss, callback)
{ //...
您可以在此处查看完整信息: https://developer.mozilla.org/en-US/docs/Using_geolocation