我正在使用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
来渲染输出。
我想做的是简单地通过wrting返回这个accounts
对象
return accounts;
答案 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.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,这使得使用异步函数变得更容易,但是你仍然需要理解为什么这种存在。通过使用异步操作,您的应用程序在等待结果时保持响应。