0

我正在使用和构建移动应用phonegap程序。我想在我的应用程序中使用数据库来存储一些用户信息。(我不能使用我想对数据进行搜索/排序操作)jQueryjQuery mobileSqLitelocal 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 deferreds的信息。

基于延迟的代码片段可能如下所示:

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

因为 SqlLite 函数是异步的,所以不能只返回值。

我会让 getAccountInformation 接收如下回调:

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

这样,您将在执行数据库请求时调用您的函数。

于 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 回答