2013-10-16 143 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),所以我不知道天氣第一個問題肯定得到解決。不管怎樣,謝謝你!!! –