Javascript 如何返回此值?
我正在使用Javascript 如何返回此值?,javascript,jquery,Javascript,Jquery,我正在使用phonegap、jQuery和jquerymobile构建一个移动应用程序。我想在我的应用程序中使用SqLite数据库来存储一些用户信息。(我无法使用本地存储我想对数据执行搜索/排序操作) 这是我为完成这项工作而编写的代码 function getAccountInformation(){ var accounts = {}; db.transaction(function(transaction) { transaction.executeSql('
phonegap
、jQuery
和jquerymobile
构建一个移动应用程序。我想在我的应用程序中使用SqLite
数据库来存储一些用户信息。(我无法使用本地存储
我想对数据执行搜索/排序操作)
这是我为完成这项工作而编写的代码
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));
}
函数getAccountInformation(){
var账户={};
db.事务(功能(事务){
transaction.executeSql('SELECT*FROM account;',[],
函数(事务、结果){
如果(result!=null&&result.rows!=null){
对于(var i=0;iconsole.log(JSON.stringify(accounts))代码>在for循环的}
结束后,它显示正确的输出
但是如果我把它放在现在的位置,{}
作为输出打印出来
如何使getAccountInformation()
函数将accounts
对象返回给我的其他函数?在这里,我将使用jQuery
呈现输出
我想做的是通过简单地编写返回这个accounts
对象
返回账户代码>,这取决于调用函数的时间。当它被异步调用(比如AJAX请求)时,您就不走运了。那样的话,我建议你读一下
基于延迟的代码段可能如下所示:
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);
var deferred=newjquery.deferred();
var账户={};
延迟。完成(函数(数据){
//在这里处理您的数据
});
db.事务(功能(事务){
transaction.executeSql('SELECT*FROM account;',[],
函数(事务、结果){
如果(result!=null&&result.rows!=null){
对于(var i=0;i
db.transaction
和transaction.executeSql
通过使用回调函数异步生成结果。这意味着您的getAccountInformation
函数将立即返回,而不会等待事务完成(如在同步调用中)
在填充accounts
数组时,简单地将回调函数作为getAccountInformation
的参数传入并运行该函数可能更容易。因此,将函数签名更改为getAccountInformation(回调)
,并将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
}
}
有一些更奇特的方法,比如jQuery延迟和承诺,可以使异步函数的工作更容易,但是您仍然需要理解为什么会存在这种情况。通过使用异步操作,应用程序在等待结果时保持响应。因为SqLite函数是异步的,所以不能只返回值
我将使getAccountInformation接收回调,如下所示:
function getAccountInformation(callbackfn)
{
db.transaction(function(transaction),
.....,
function (transaction, result)
{
if (result != null)
{
callbackfn(result);
}
});
}
这样,当db请求执行时,您将得到调用的函数。这只是一个简单的函数,在该函数中,我将使用for In
循环对返回的对象进行迭代,以便向DOM
添加新元素。这与此问题无关:)您只需在for
循环的}
结束后调用另一个函数即可。例如:otherFunction(账户)代码>这是我不想做的…:)要调用的函数并不总是相同的。它将根据场景而有所不同。我想做的是使这个函数getAccountInformation()
通用。如果我在这个函数中调用一个函数,那么我的整个新体系结构将毫无用处。好的,我明白了,在这种情况下,您可以传递这个函数,作为getAccountInformation(callBackFunction)
generic函数的参数进行调用。我明白:)。。。Callbackfn并不总是相同的。它将根据场景而变化。每页上显示元素的方式各不相同。。所以我只想以某种方式把这个物体拿回来。或者我必须重新设计整件事:(谢谢,用你的方法解决了它。)只需一次更正。您不能以callbackfn(result)
的形式调用回调函数,因为我们是以字符串形式传递函数名,所以必须像window[callbackfn](result)那样使用它代码>这就是你是否真的要传递一个函数名。但您也可以传递函数本身。例如,函数processResult(result){//do something}getAccountInformation(processResult);在本例中,您传递的是函数,而不是名称,可以直接调用它。我尝试了这个,但没有成功。在调用函数中,我仍然以undefined
function getAccountInformation(callbackfn)
{
db.transaction(function(transaction),
.....,
function (transaction, result)
{
if (result != null)
{
callbackfn(result);
}
});
}