0

phonegap、、jQueryを使用してモバイルアプリを構築していjQuery mobileます。SqLiteアプリでデータベースを使用して、ユーザー情報を保存したいと思います。(local storageデータの検索/並べ替え操作は使用できません)

これは私がこれを成し遂げるために取り組んでいるコードです、

function getAccountInformation(){
    var accounts = {};
    db.transaction(function(transaction) {
        transaction.executeSql('SELECT * FROM account;', [], 
            function(transaction, result) { 
                if (result != null && result.rows != null) { 
                    for (var i = 0; i < result.rows.length; i++) {
                        var item={};
                        var row = result.rows.item(i); 
                        for(var prop in row){
                            item[prop]=row[prop]
                        }
                        accounts[i]=item;
                    }
                }
            },errorHandler
        );
    },errorHandler,nullHandler);
    console.log(JSON.stringify(accounts));
}

これをconsole.log(JSON.stringify(accounts));終了後に置く}と、for loop適切な出力が表示されます。

しかし、今のところに置くと{}、出力として出力されます。

関数にそのオブジェクトを他の関数にgetAccountInformation()戻すにはどうすればよいですか?出力をレンダリングするためにaccounts使用する場所。jQuery

私がやりたいのはaccounts、書くだけでこのオブジェクト を返すことですreturn accounts;

4

3 に答える 3

1

これは、関数がいつ呼び出されるかによって異なります。(AJAXリクエストのように)非同期的に呼び出されると、運が悪くなります。その場合は、jQueryの延期について読むことをお勧めします。

延期に基づくコードスニペットは次のようになります。

var deferred = new jQuery.Deferred();
var accounts = {};

deferred.done(function(data) {
    // process your data here
});

db.transaction(function(transaction) {
    transaction.executeSql('SELECT * FROM account;', [], 
        function(transaction, result) { 
            if (result != null && result.rows != null) { 
                for (var i = 0; i < result.rows.length; i++) {
                    var item={};
                    var row = result.rows.item(i); 
                    for(var prop in row){
                        item[prop]=row[prop]
                    }
                    accounts[i]=item;
                }
                deferred.resolve(accounts); // let the "done" function get called
            } else {
                deferred.reject();
            }
        }, errorHandler
    );
},errorHandler,nullHandler);
于 2012-08-28T10:15:31.783 に答える
1

SqLite関数は非同期であるため、値を返すだけでは不十分です。

getAccountInformationが以下のようにコールバックを受信するようにします。

function getAccountInformation(callbackfn)
{
    db.transaction(function(transaction),
        .....,
        function (transaction, result)
        {
            if (result != null)
            {
               callbackfn(result);
            }
        });
}

このようにして、dbリクエストが実行されたときに関数が呼び出されます。

于 2012-08-28T10:21:12.727 に答える
0

db.transactionコールバック関数を使用して、非同期で結果をtransaction.executeSql生成します。これは、関数がすぐに戻り、トランザクションが完了するのを待たないことを意味します(同期呼び出しの場合のように)。getAccountInformation

コールバック関数を引数として渡して、配列にデータが入力getAccountInformationされたときにその関数を実行する方がおそらく簡単です。accountsしたがって、関数のシグネチャを次のように変更し、コールバックを次のようgetAccountInformation(callback)に置き換えます。executeSql

        function(transaction, result) { 
            if (result != null && result.rows != null) { 
                for (var i = 0; i < result.rows.length; i++) {
                    var item={};
                    var row = result.rows.item(i); 
                    for(var prop in row){
                        item[prop]=row[prop]
                    }
                    accounts[i]=item;
                }
                callback(accounts); // Call callback function with populated accounts
            }
        }

次に、次のコマンドでこの関数を呼び出すことができます。

getAccountInformation(function(accounts) {
    // Do something with the accounts
});

jQuery DeferredsやPromisesなど、非同期関数の操作を簡単にするより洗練された方法がありますが、それでも、これが存在する理由を理解する必要があります。非同期アクションを使用することにより、アプリケーションは結果を待つ間、応答性を維持します。

于 2012-08-28T10:20:52.947 に答える