Javascript Phonegap函数在数据库回调中调用时返回错误的数字

Javascript Phonegap函数在数据库回调中调用时返回错误的数字,javascript,iphone,jquery-mobile,cordova,Javascript,Iphone,Jquery Mobile,Cordova,我正在使用JQM和Phonegap。我有一个计算两点之间距离的函数。 我在Xcode中做这件事,并给出了模拟器lat=51.4863 long=-3.179169 distance = function(lat1, lon1, lat2, lon2, unit) { var radlat1 = Math.PI * lat1/180; var radlat2 = Math.PI * lat2/180; var radlon1 = Math.PI * lon1/180;

我正在使用JQM和Phonegap。我有一个计算两点之间距离的函数。 我在Xcode中做这件事,并给出了模拟器lat=51.4863 long=-3.179169

distance = function(lat1, lon1, lat2, lon2, unit) 
{ 
    var radlat1 = Math.PI * lat1/180;
    var radlat2 = Math.PI * lat2/180;
    var radlon1 = Math.PI * lon1/180;
    var radlon2 = Math.PI * lon2/180;
    var theta = lon1-lon2;
    var radtheta = Math.PI * theta/180;
    var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
    dist = Math.acos(dist);
    dist = dist * 180/Math.PI;
    dist = dist * 60 * 1.1515;
    dist = dist * 1.609344;
    if (unit=="M") { dist = dist / 1.609344 ;}
    if (unit=="N") { dist = dist * 0.8684 ;}
    alert(dist);
    return dist;
}
我也有一个数据库的位置,我想返回距离

如果从my db.transactions executeSQL的onsuccess回调调用distance函数,则返回错误的数字

但是,当我在getCurrentPosition的成功回调上调用此函数时,它工作正常。请记住,我在这里还运行了一个SQL Select查询

我的函数工作时的代码如下:

$( document ).delegate("#mfinder", "pageinit", function() {

  var db = window.openDatabase("Database", "1.0", "location Data", 200000);
  db.transaction(inputData, errorCB, inputDataSuccess);
});

function inputData(tx) {
    tx.executeSql('DROP TABLE IF EXISTS locations');
    tx.executeSql('CREATE TABLE locations (id UNIQUE, name, lat, lon, pcode)');
    tx.executeSql('INSERT INTO locations VALUES (1, "My house", 51.4863, -3.179169, "E20QP")');
    tx.executeSql('INSERT INTO locations VALUES (2, "Manchester", 51.548577,0.708275, "ABC123")');
}

function inputDataSuccess() {
    var db = window.openDatabase("Database", "1.0", "location Data", 200000);
    db.transaction(readLocations, errorCB);
}

function readLocations(tx) {
    tx.executeSql('select * from locations', [], getDistance, errorCB);
}

function getDistance (tx, r){
    d1 = r.rows.item(1).lat;
    d2 = r.rows.item(1).lon;
    d3 = r.rows.item(1).name;
}

$("#fm").click(function() {
navigator.geolocation.getCurrentPosition(onSuccess, onError);
});

function onSuccess(position) {
    clat = position.coords.latitude;
    clon = position.coords.longitude;
    var x = distance(clat, clon, d1, d2, "M");
    alert(x); //THIS WORKS!
}
当函数返回错误的数字时,我的代码如下:

clat = 0;
clon = 0;
$("#fm").click(function() {
    navigator.geolocation.getCurrentPosition(onSuccess, onError);
    var db = window.openDatabase("Database", "1.0", "location Data", 200000);
    db.transaction(inputData, errorCB, inputDataSuccess);
});

function onSuccess(position) {
    clat = position.coords.latitude;
    clon = position.coords.longitude;
}

function inputData(tx) {
    tx.executeSql('DROP TABLE IF EXISTS locations');
    tx.executeSql('CREATE TABLE locations (id UNIQUE, name, lat, lon, pcode)');
    tx.executeSql('INSERT INTO locations VALUES (1, "My house", 51.4863, -3.179169, "E20QP")');
    tx.executeSql('INSERT INTO locations VALUES (2, "Manchester", 51.548577,0.708275, "ABC123")');
}

function inputDataSuccess() {
    var db = window.openDatabase("Database", "1.0", "location Data", 200000);
    db.transaction(readLocations, errorCB);
}

function readLocations(tx) {
    tx.executeSql('select * from locations', [], getDistance, errorCB);
}

function getDistance (tx, r){
    d1 = r.rows.item(1).lat;
    d2 = r.rows.item(1).lon;
    d3 = r.rows.item(1).name;
var milesAway = distance(clat, clon, d1, d2, "M"); //wrong figures!!!
alert(milesAway);
}
第一种方式是这样的。。。。在PageInit中,我创建数据并将数据选择到内存中。然后,“单击”功能将启用定位服务并执行距离功能

第二种情况是pageinit上什么都没有,一切都在点击事件上。在这里,我首先检索用户的位置,然后运行数据库并返回一个数据行以计算disdance


现在,有人能告诉我为什么我得到了错误的数字吗???理想情况下,我希望第二个代码库能够工作,这样,我可以循环加载数据以附加到DIV元素。非常感谢所有关注我的问题的人。

我很确定这是因为您没有以异步方式调用代码。您希望在执行DB事务之前设置clat和clon。由于对getPosition的调用是异步的,因此它可能在getDistance方法之后返回,从而给出错误的结果。尝试设置它,以便在设置clat和clon之后,在onSuccess方法中调用window.openDatabase和db.transaction()。这应该会得到正确的结果。

在设置clat和clon之后,我设置了一个事务以选择*,然后是一个回拨运行距离函数。没有工作,仍然得到错误的结果。但是你的想法是对的,谢谢你指出异步。我学到了一些新东西。