Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何返回此值?_Javascript_Jquery - Fatal编程技术网

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;i 如果我把这个
console.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);
            }
        });
}