2013-10-16 99 views
1

我正在创建一个手机应用程序。我使用一个小jQuery和这个插件:html5sql.com/,用于处理数据库。我的程序以奇怪的顺序运行。我在代码中添加了一些警报,并在每个数据后面写下了一条评论,其中包含我在设备上启动应用程序时显示的数字。有没有人有一个想法,为什么它不从上到下运行?程序以奇怪的顺序运行?

在global.js

  • 我创建了一个功能,允许我来创建新的对象站“
  • 我创建具有三个ID的(RELID)一个阵列

    var station = function(id) { 
        this.id = id; 
    }; 
    
    var relID=new Array(); 
    relID[0]=2762378; 
    relID[1]=2746459; 
    relID[2]=2748307;

在index.js

  • 我打电话dbStuff()与RELID数组作为参数
  • (我保存在一个名为
  • 我提醒返回数组的第一个对象的品牌属性变量返回的值,因为评论当然,其不确定在这个时候 - 但是这就是我想做的事情时,代码工作)
var app = { 

    initialize: function() { 
     this.bindEvents(); 
     alert('vor dbStuff() aufruf');//1----- 
     var relStations=dbStuff(relID); 
     alert('nach dbStuff() aufruf');//6----- 
     //alert(relStations[0].brand); ---UNDEFINED--- 
    }, 
    ...phonegap stuff...

在loaddb.js

  • 我创建了一个函数“dbStuff()”这应该:
  • 创建新的/打开的数据库和在
  • 从该数据库读写的东西,并在一台对象 写那些值(对于每个RELID [ ])
  • 把所有的站数组中的对象,并将其返回
function dbStuff(relID) { 
    //NEW ARRAY WHERE ALL STATION OBJECTS WILL BE SAVED 
    var relStations=[]; 

    alert('dbStuff() neues Array erstellt');//2----- 

    //OPEN DATABASE AND WRITE DATA INTO 
    try { 
    html5sql.openDatabase("stations", "stations", 5 * 1024 * 1024); 

    alert('open DB');//3----- 

    $.get('js/db/stations.sql', function(dump) { 

     alert('sbStuff() dump geladen');//7----- 

     html5sql.process(
      dump, 
      function() { //Success 
       alert('dump success'); 
      }, 
      function(error, failingQuery) { //Failure 
       alert('dump fail'); //14----- 
      } 
     ); 

    }); 
    } 
    catch (error) { 
     alert("Error: " + error.message); 
    } 

    //GET DATA FROM DATABASE AND WRITE IT IN A STATION OBJECT 
    //(FOR EACH ID IN 'relID' ARRAY) 
    //FILL 'relStations' ARRAY WITH THE STATION OBJECTS AND RETURN IT 
    for(var i=0; i<relID.length; i++){ 

     var stationa=new station(relID[i]); 

     alert('dbStuff()-for neues station Objekt erstellt');//4----- 

     //ARRAY WITH SQL STATEMENTS 
     var sqlarray = [ 
      {"sql" : "SELECT latitude FROM stations WHERE id=" + relID[i], 
      "data" : [], 
      "success" : function (tx, rs) {stationa.latitude=rs.rows.item(0).latitude;alert('SQL lat');//8----- 
      } 
      }, 
      {"sql" : "SELECT longitude FROM stations WHERE id=" + relID[i], 
      "data" : [], 
      "success" : function (tx, rs) {stationa.longitude=rs.rows.item(0).longitude;alert('SQL long');//9----- 
      } 
      }, 
      {"sql" : "SELECT brand FROM stations WHERE id=" + relID[i], 
      "data" : [], 
      "success" : function (tx, rs) {stationa.brand=rs.rows.item(0).brand;alert('SQL brand');//10----- 
      } 
      }, 
      {"sql" : "SELECT name FROM stations WHERE id=" + relID[i], 
      "data" : [], 
      "success" : function (tx, rs) {stationa.name=rs.rows.item(0).name;alert('SQL name');//11----- 
      } 
      }, 
      {"sql" : "SELECT federalstate FROM stations WHERE id=" + relID[i], 
      "data" : [], 
      "success" : function (tx, rs) {stationa.federalstate=rs.rows.item(0).federalstate;alert('SQL federalstate');//12----- 
      } 
      } 
     ]; 

     try {html5sql.process(
      sqlarray, 
      function() { //Success 
       //alert('lat: ' + stationa.latitude + ', long: ' + stationa.longitude + ', brand: ' + stationa.brand + ', name:' + stationa.name + ', fedeeralstate:' + stationa.federalstate); 
       relStations[i]=stationa; 
       alert('Array füllen');//13----- 
       //alert(relStations[i].brand); 
      }, 
      function() { //Failure 
       alert('SQL FAIL'); 
      });} 
      catch(error) { 
      alert("Error: " + error.message); 
     } 

    } 
    alert('return relStations'); //5----- 
    return relStations; 
} 
+0

所有提醒都不清楚或只是一些具体的数字? –

+0

我认为这是因为get()方法在加载其他所有内容之前运行。所以新的问题是:如何在页面加载之前做一个ajax请求? –

+0

为什么你要在页面加载之前做一个ajax请求?你不能加载页面本身的东西吗? –

回答

0

这可能是因为回调函数需要等待脚本在他们被调用之前结束。

get功能全警报3将运行,但它的回调函数时,服务器返回什么吃的去功能,这可能需要一点时间才会运行。与此同时,函数之后的代码将运行,因为它是一个异步请求。
因此,您将看到警报4,5和6,之后请求已由服务器处理,并且(匿名)回调函数被调用,其中警报警报7

相同的其他ajax调用。

您可以尝试以下操作。我将一些东西移到了函数loadStations中。 此函数将在您的get-call的回调函数中调用,但只有在成功的情况下。

function dbStuff(relID) { 
    //NEW ARRAY WHERE ALL STATION OBJECTS WILL BE SAVED 
    var relStations=[]; 

    alert('dbStuff() neues Array erstellt');//2----- 

    //OPEN DATABASE AND WRITE DATA INTO 
    try { 
    html5sql.openDatabase("stations", "stations", 5 * 1024 * 1024); 

    alert('open DB');//3----- 

    $.get('js/db/stations.sql', function(dump) { 

     alert('sbStuff() dump geladen');//7----- 

     html5sql.process(
      dump, 
      function() { //Success 
       alert('dump success'); 

       return loadStations(relID); 
      }, 
      function(error, failingQuery) { //Failure 
       alert('dump fail'); //14----- 
      } 
     ); 

    }); 
    } 
    catch (error) { 
     alert("Error: " + error.message); 
    } 
} 

function loadStations(relID) { 

    //GET DATA FROM DATABASE AND WRITE IT IN A STATION OBJECT 
    //(FOR EACH ID IN 'relID' ARRAY) 
    //FILL 'relStations' ARRAY WITH THE STATION OBJECTS AND RETURN IT 
    for(var i=0; i<relID.length; i++){ 

     var stationa=new station(relID[i]); 

     alert('dbStuff()-for neues station Objekt erstellt');//4----- 

     //ARRAY WITH SQL STATEMENTS 
     var sqlarray = [ 
      {"sql" : "SELECT latitude FROM stations WHERE id=" + relID[i], 
      "data" : [], 
      "success" : function (tx, rs) {stationa.latitude=rs.rows.item(0).latitude;alert('SQL lat');//8----- 
      } 
      }, 
      {"sql" : "SELECT longitude FROM stations WHERE id=" + relID[i], 
      "data" : [], 
      "success" : function (tx, rs) {stationa.longitude=rs.rows.item(0).longitude;alert('SQL long');//9----- 
      } 
      }, 
      {"sql" : "SELECT brand FROM stations WHERE id=" + relID[i], 
      "data" : [], 
      "success" : function (tx, rs) {stationa.brand=rs.rows.item(0).brand;alert('SQL brand');//10----- 
      } 
      }, 
      {"sql" : "SELECT name FROM stations WHERE id=" + relID[i], 
      "data" : [], 
      "success" : function (tx, rs) {stationa.name=rs.rows.item(0).name;alert('SQL name');//11----- 
      } 
      }, 
      {"sql" : "SELECT federalstate FROM stations WHERE id=" + relID[i], 
      "data" : [], 
      "success" : function (tx, rs) {stationa.federalstate=rs.rows.item(0).federalstate;alert('SQL federalstate');//12----- 
      } 
      } 
     ]; 

     try {html5sql.process(
      sqlarray, 
      function() { //Success 
       //alert('lat: ' + stationa.latitude + ', long: ' + stationa.longitude + ', brand: ' + stationa.brand + ', name:' + stationa.name + ', fedeeralstate:' + stationa.federalstate); 
       relStations[i]=stationa; 
       alert('Array füllen');//13----- 
       //alert(relStations[i].brand); 
      }, 
      function() { //Failure 
       alert('SQL FAIL'); 
      });} 
      catch(error) { 
      alert("Error: " + error.message); 
     } 

    } 
    alert('return relStations'); //5----- 
    return relStations; 

} 
+0

好的,但我希望代码打破,直到服务器返回文件。代码运行并执行警报(4,...),然后执行回调get - 那不是我想要的回调。 –

+0

然后这也可以移到回调函数中。可能有更好的选择,但目前我还不太足以提出建议。 –

+0

是的,我想你明白了!不幸的是,我现在必须与这个问题作斗争(http://stackoverflow.com/questions/12319809/application-error-the-connection-to-the-server-was-unsuccessful-file-andr),所以我不知道天气第一个问题肯定得到解决。不管怎样,谢谢你!!! –