2012-03-20 129 views
0

我是javascript新手,无法找到解决方案。 我已经阅读了一些类似的问题,但看起来并不像我的问题一样。从函数返回'undefined'变量

我调用一个方法从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); 
} 

如果我用警报的对话框中被调用的函数,变量nextp是2. 但是,如果我返回变量,它会提醒为'未定义'。 另外,如果我等变量var nextp = 11;通过“db.transaction ...”和函数末尾的return语句,它将返回11而不是2.

是因为变量未在函数启动时发送到内部函数? :)

任何想法做什么?谢谢!

回答

1

我不知道JavaScript中的SQLite是如何工作的,但我怀疑它是异步工​​作的,所以你在turnPage中调用alert,但事务正在运行异步并且返回值在另一个范围内。您可以尝试通过一个回调函数来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); 
} 
+0

Thans,它的工作! (如果有人使用此代码,警告中有一个错字,它应该是alert(nextp),而不是alert(nextpage) – TorK 2012-03-20 11:30:02

+0

gah,true。固定错字。 – 2012-03-20 11:32:25

+0

@ user1255456记住接受答案,如果它解决了问题 – 2012-03-20 11:51:19

0

您的外部函数永不实际返回nextp在任何时间。

有两种解决方案,以什么(我觉得)你要做的

  1. 创建一个全局变量和存储nextp存在的价值。
  2. 引入另一个回调以使用nextp的值,例如创建新链接或其他。如果你愿意,你可以把代码放在另一个函数中,并把它作为参数传递给getNextPage(),或者直接把代码放到最内部的函数中(在alert调用的位置)。

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

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

0

因为它是现在,有几个问题与您的代码。

  1. 如JavaScript大多是asynchronus,你的代码:

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

    会打电话的getNextPage()但它不会等到移动之前的响应,因此警报会被马上解雇,并在此点,如果没有返回并分配响应(可能是这种情况),那么nextpage将是未定义的。

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