【问题标题】:Return executeSQL function返回执行SQL函数
【发布时间】:2013-12-20 00:51:28
【问题描述】:

我正在尝试使用 SQLite 返回 SQL 查询的结果。 查询工作正常,我可以在 executeSql 函数中输出结果。但是当我尝试从我的主函数(returnSQLArray)访问数组时,它是未定义的。 我该如何解决这个问题?

我在另一个需要查询结果的函数中调用 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     
}

谢谢

【问题讨论】:

    标签: javascript sqlite callback closures


    【解决方案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
    }
    

    【讨论】:

    • 我担心会是这样。有没有办法解决这个问题?我见过一些解决方案,人们使用 setTimeout 方法来避免异步问题。有没有更好的办法?
    • 有什么原因不能在回调中完成所有需要的工作吗?
    • 我必须在调用它的函数中使用结果数组。示例:在一个名为 getPersons 的函数中,我想调用 returnSQLArray('SELECT * FROM PERSONS'),然后在函数内部使用该数组。我不能从我的回调函数中返回它,对吧?
    • @user1698462 - 请参阅我上面的编辑,了解执行您建议的一种方法。如果对您有帮助,请标记我的回答。
    • 谢谢,它成功了。是否可以将 processPersonsResponse 中的数组返回到我的初始函数 getPersons?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多