【问题标题】:return data from executeAsync to the calling function (javascript/mozilla)从 executeAsync 返回数据到调用函数 (javascript/mozilla)
【发布时间】:2012-06-03 08:59:14
【问题描述】:

我是 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.
}

非常感谢您的帮助

【问题讨论】:

    标签: javascript firefox parameters storage mozilla


    【解决方案1】:

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

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

    这当然是意料之中的executeAsync,顾名思义,是异步的。这意味着当您调用executeAsync 时,该操作将被安排稍后。 Javascript 具有 run-to-completion 语义,因此将继续执行直到到达 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来获取行中某列的值。

    【讨论】:

    • 抱歉含糊不清,我以为我很清楚。但是你明白了,因为你让我找到了解决方案。谢谢你。 (我提取了列,但与问题无关)这是我所做的:
       handleCompletion: function(aReason) { if (aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED) { if (!this.空){返回copyRes(行,myRows,descResults); } } else { Cu.reportError("异步语句执行完成 (" + aError.result + "): " + aError.message); } } 
      但是,这是一种优雅的方式吗?
    • 我会投你一票,但我太新了。没有足够的代表。再次感谢您
    • 我认为您将成功返回零行(因为表为空)的请求与失败的请求(例如,因为数据库已损坏)混淆了。否则,是的,这听起来不错。
    • 另外,请编辑您的帖子以使用正确的格式。谢谢! :)
    • errr... 格式:我试过了。它不起作用。另外,现在,我在之前的评论中根本没有“编辑”选项。只删除。如何编辑代码以使其正确显示?使用“代码”不会执行格式。关于handleCompletion:为什么困惑?仅在 aReason 不是 REASON_FINISHED 的情况下调用 reportError。在空旷的情况下没有“其他”。请解释? (还是格式不好?)
    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2022-01-03
    • 2015-01-26
    • 2020-04-23
    相关资源
    最近更新 更多