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 には run-to-completion セマンティクスがあるため、実行はステートメントに到達するまで続行されます。この時点では、クエリはまだ実行されていません。関数が完了すると、JS エンジンが非同期ステートメントを実行し、コールバックが呼び出されます。次に、データに対して必要なことを実行するのはコード次第です。たとえば、別の関数を呼び出してデータを処理します。return rowshandleCompletionhandleCompletion

また、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 に答える