我是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。
是因为变量在我的函数开始时没有被发送到内部函数吗? :)
有什么想法怎么办?谢谢!
答案 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
。
有两种解决方案(我认为)你要做什么
nextp
的值存储在那里。nextp
的值,例如,创建新链接或其他任何内容。如果需要,可以将代码放在另一个函数中,并将其作为参数传递给getNextPage()
,或者将代码直接放入最内部的函数中(在alert
调用的位置)。 / LI>
醇>
请注意,回调用于处理许多JavaScript API的异步性质。因此,当getNextPage()
完成时,即使您的getNextPage()
也无法返回内部查询的值,因为该值不存在。
无论如何,最内部函数中的return
语句可以被删除,因为没有实际接收该值的函数。
答案 2 :(得分:0)
就像现在一样,您的代码存在一些问题。
由于JavaScript主要是asynchronus,您的代码:
nextpage = getNextPage(current);
alert(nextpage);
将调用getNextPage()
,但在继续之前不会等待响应,因此将立即触发警报,此时,如果尚未返回并分配响应(可能是如果是这样的话,那么nextpage
将是未定义的。
你的第二个问题是你的外部功能没有返回任何东西。您从内部函数返回值,但随后在外部函数中“卡住”。一种解决方案是将值赋给全局变量,而不是从函数返回它。您仍然需要注意“异步问题”,以便在分配全局变量之前不要读取它。