从函数返回'undefined'变量

时间:2012-03-20 10:55:44

标签: javascript html sqlite

我是javascript的新手,无法找到解决方案。 我已经阅读了一些类似的问题,但看起来问题与我的问题不一样。

我使用以下代码从script1调用方法:

 function turnPage(){
    var current = window.now;
    var nextpage = getNextPage(current);
    alert(nextpage);
}

在script2中有一个SQLite等:

function getNextPage(Pid) {
    db.transaction(function(tx) {
        tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [],
                    function(tx, results) {
            nextp = parseInt(results.rows.item(0).NextPage);
            //alert(nextp);
            return nextp;   
        }, errorCB);
    }, errorCBQuery);
}

如果我在被调用函数中使用alert-dialog,则变量nextp为2。 但是如果我返回变量,它将警告为“未定义”。 另外,如果我等变量var nextp = 11;通过“db.transaction ...”和函数末尾的return语句,它将返回11而不是2。

是因为变量在我的函数开始时没有被发送到内部函数吗? :)

有什么想法怎么办?谢谢!

3 个答案:

答案 0 :(得分:1)

我不知道javascript中的SQLite是如何工作的,但是我怀疑它是异步工​​作的,所以你在alert中调用turnPage但是事务正在运行异步并且返回值在另一个中范围无论如何。您可以尝试将回调函数传递给getNextPage,然后返回nextp而不是以nextp作为参数调用回调:

function turnPage(){
    var current = window.now;
    getNextPage(current, function (nextp) { alert(nextp); /* do whatever else you need to do */ });
}



function getNextPage(Pid, cb) {
    db.transaction(function(tx) {
        tx.executeSql('SELECT * FROM Page WHERE Pid=' + Pid, [],
                    function(tx, results) {
            nextp = parseInt(results.rows.item(0).NextPage);
            cb(nextp);   
        }, errorCB);
    }, errorCBQuery);
}

答案 1 :(得分:0)

您的外部函数永远不会在任何时候返回nextp

有两种解决方案(我认为)你要做什么

  1. 创建一个全局变量并将nextp的值存储在那里。
  2. 引入另一个回调以使用nextp的值,例如,创建新链接或其他任何内容。如果需要,可以将代码放在另一个函数中,并将其作为参数传递给getNextPage(),或者将代码直接放入最内部的函数中(在alert调用的位置)。 / LI>

    请注意,回调用于处理许多JavaScript API的异步性质。因此,当getNextPage()完成时,即使您的getNextPage()也无法返回内部查询的值,因为该值不存在。

    无论如何,最内部函数中的return语句可以被删除,因为没有实际接收该值的函数。

答案 2 :(得分:0)

就像现在一样,您的代码存在一些问题。

  1. 由于JavaScript主要是asynchronus,您的代码:

    nextpage = getNextPage(current);
    alert(nextpage);
    

    将调用getNextPage(),但在继续之前不会等待响应,因此将立即触发警报,此时,如果尚未返回并分配响应(可能是如果是这样的话,那么nextpage将是未定义的。

  2. 你的第二个问题是你的外部功能没有返回任何东西。您从内部函数返回值,但随后在外部函数中“卡住”。一种解决方案是将值赋给全局变量,而不是从函数返回它。您仍然需要注意“异步问题”,以便在分配全局变量之前不要读取它。