2013-12-03 114 views
2

我想使用SQLite返回SQL查詢的結果。 查詢工作正常,我可以在executeSql函數內輸出結果。但是當我嘗試從我的主函數(returnSQLArray)到達數組時,它是未定義的。 我該如何解決這個問題?返回executeSQL函數

我在另一個函數中調用returnSQLArray,我需要查詢的結果。

代碼:

function returnSQLArray(str) 
{ 
    var db = window.openDatabase("Database", "1.0", "Name", 200000); 
    var result = []; 
    db.transaction(
     function (tx, results) { 
      tx.executeSql(str, [], function(tx, rs) { 
       for(var i=0; i<rs.rows.length; i++) { 
         var row = rs.rows.item(i) 
         result[i] = { 
          id: row['id'] 
         } 
       } 
       console.log(result[0].id); //Returns the id 
      });     
     } 
    ); 
    console.log(result[0].id); //Undefined  
} 

謝謝

回答

1

這是一個異步的問題。 db.transaction需要一個在sqlite事務完成後執行的回調函數。您的方法末尾顯示的console.log()聲明實際上是在result已被填充之前發生的。

編輯此外:

functions getPersons() { 
    returnSQLArray('SELECT * FROM PERSONS', processPersonsResponse); 
} 

function returnSQLArray(str, callback) { 
    ... 
    tx.executeSql(str, [], function(tx, rs) { callback(result); }); 
} 

function processPersonsResponse(response) { 
    //do work with response 
} 
+0

我很擔心,這是如此。無論如何要解決這個問題嗎?我見過一些解決方案,人們使用setTimeout方法來避免異步問題。有沒有更好的辦法? – user1698462

+0

有沒有一個原因,你不能只做回調內所需的所有工作? – EkoostikMartin

+0

我必須在我稱之爲函數的地方使用結果數組。示例:在一個名爲getPersons的函數中,我想調用returnSQLArray('SELECT * FROM PERSONS'),然後在函數內部使用該數組。 我不能從我的回調函數中返回它,對吧? – user1698462