0

これは簡単に可能ですか?結果が空のセットでない場合にのみ、handleResult メソッドが実行されるようです。

私が考えていたのは、handleResult と handleCompletion をオブジェクトのメンバー関数にし、handleResult に handleCompletion がチェックできるメンバー変数を更新させることでした。変数が設定されている場合は空ではなく、変数が設定されていない場合は空であり、それに応じて動作します。

複雑すぎるようで、より良い解決策があることを願っていますか?

4

1 に答える 1

1

解決策をスケッチする(上記の考え)(編集2:以下のコメントごと)

function sql() {
    this.results = false;
    var me = this;

    this.handleResult = function(aResultSet) {

        for (var row = aResultSet.getNextRow(); row;  row = aResultSet.getNextRow()) {
            me.results = true;

            var value = row.getResultByName("name");
        }
    };

    this.handleError = function(aError) {
        .... //deal with error
    };

    this.handleCompletion = function(aReason) {
        if (me.results) {
            ....//results
        } else {
            ....//no results
        }

        if (aReason != Components.interfaces.mozIStorageStatementCallback.REASON_FINISHED) {
            ....//handle these
    };
};

s = new sql(); 

statement.executeAsync({
    handleResult: s.handleResult,
    handleError: s.handleError,
    handleCompletion: s.handleCompletion
});

これは、この問題を解決する良い方法と考えられていますか?

edit1: これは期待どおりに動作しません (動作しますが、その理由は 100% わかりません)。つまり、handleResult が実行されない場合、this.results 変数は未定義 (false ではない) です。したがって、handleResult と handleCompletion が、予想とは異なる一連の変数で動作しているかのように見えます。

私が間違っていることを理解するための助けをいただければ幸いです。

于 2012-07-03T04:23:37.540 に答える