4

我是 Javascript 新手,正在尝试编写一个 firefox 插件。
我正在尝试将从 SQL 查询返回的数据传递/提取到调用函数。它似乎不起作用。
我搜索了有关变量范围的信息,查看了我可以在此站点上看到的任何相关帖子,并尝试了据说有效的示例,但没有一个对我有用。

我使用的存储信息来自:
https://developer.mozilla.org/en/Storage
https://developer.mozilla.org/en/mozIStorageStatement

我做错了什么,或者我该怎么做?
我在 xp 上运行 Firefox 12。

function Sqlite() {
   this.dbConn = "";
   this.empty = true;
}

Sqlite.prototype.retrieveData = function(query)
{
    var rows = new Array(); // to be returned to the calling function
    var stmt = this.dbConn.createStatement(query); // my "select..." statement

    stmt.executeAsync ({
     handleResult: function(aResultSet)
     {
        this.empty = false;
        var i = 0;
        for (let row; row = aResultSet.getNextRow();i++) {
           rows[i] = row;
        }
     },

     handleError: function(anError) {
        //some code
     },

     handleCompletion: function(aReason) {
        if (this.empty) {
            // CODE FOR WHEN STATEMENT EXECUTION IS FINISHED
        }
        if (aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED) {
           document.getElementById("debug").value = rows[0]; //gets the data from the query: [xpconnect wrapped mozIStorageRow]
           return true;
         }
     }
    });  
    document.getElementById("debug").value = rows[0]; //gets undefined
    stmt.finalize();

    return rows;  // the info is no longer available at this point.
}

我会非常感谢你的帮助

4

1 回答 1

4

你描述问题的方式有点含糊,但是当你写的时候:

return rows; // the info is no longer available at this point.

这当然是意料之中的。executeAsync,顾名思义,是异步的。这意味着当您调用时executeAsync,该操作将安排在稍后进行。Javascript 具有运行到完成的语义,因此执行将继续,直到到达return rows语句为止。此时,查询尚未执行!一旦你的函数完成,JS引擎将执行你的异步语句并调用你的handleCompletion回调。然后由代码handleCompletion来对数据做任何你想做的事情,例如调用另一个函数来做一些事情。

此外,您的empty变量似乎不需要。

handleCompletion: function(aReason) {
   if (aReason != Ci.mozIStorageStatementCallback.REASON_FINISHED) {
     // something went wrong
   } else {
     // do something useful with rows
   }
},

最后,您需要调用row.getResultByName以获取行中列的值。

于 2012-06-03T13:05:53.083 回答