如何返回这个值?

时间:2012-08-28 10:11:13

标签: javascript jquery

我正在使用phonegapjQueryjQuery 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来渲染输出。

我想做的是简单地通过wrting返回这个accounts对象 return accounts;

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

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

我会让getAccountInformation接收回调,如下所示:

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

通过这种方式,您将在执行db请求时调用函数。

答案 2 :(得分:0)

db.transactiontransaction.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,这使得使用异步函数变得更容易,但是你仍然需要理解为什么这种存在。通过使用异步操作,您的应用程序在等待结果时保持响应。