0

私のFirefox拡張機能には、いくつかのテーブルを持つsqliteデータベースがあります。executeAsync()を使用して、テーブルを更新し、いくつかの新しいデータを挿入し、いくつかの値を選択しました。セレクトケースは私にいくつかの問題を引き起こします。

handleCompletion()-function内で、テーブルから取得したデータを別の関数に渡すことができます(たとえば、結果を警告することができます)。しかし、結果を呼び出し元の関数に返したいと思います。問題の答えをネットで検索しましたが、解決策が見つかりません。

私が見つけたもの:

retrieveData: function() {
    var rows = new Array(); 

    if (this.dbConn.connectionReady){
        statement = this.dbConn.createAsyncStatement("SELECT * " +
                                                "FROM 'domains' " +
                                                ";");

        statement.executeAsync ({
            handleResult: function(aResultSet) {
                var i = 0;

                for (let row = aResultSet.getNextRow(); row; row = aResultSet.getNextRow()) {
                   rows[i] = row;
                   ++i;
                }
            },

            handleError: function(anError) {
                alert("error");
            },

            handleCompletion: function(aReason) { 
                if (aReason != Components.interfaces.mozIStorageStatementCallback.REASON_FINISHED) { 
                    // something went wrong
                    alert("error2");
                } 
            }
        });
    } 

    return rows;
}

このコードは期待される結果を返しません。このステートメントは、メソッドが配列の「行」を返した後に実行されます。したがって、私の呼び出し関数はテーブルからデータを受信できません...

どうすればこの問題を解決できますか?テーブルのデータ行を返すためのタイムアウトのようなものはありますか?

助けてくれてありがとう!

4

1 に答える 1

1

上記の例では、理想的にはコールバックを処理する必要があります。これが、SQLite API 開発者が API の使用を意図した方法です。:)

retrieveData: function(_callback) {
   ...
   statement.executeAsync ({
      ...
      handleCompletion: function(aReason) { 
         ...
         _callback(rows);
      }
   });
}

そして、関数を呼び出す場所:

retrieveData(function(rows) {
   // do stuff with rows here
});
于 2013-02-09T13:42:30.577 に答える