javascript嵌套函数和变量
上面的代码无效,所以我尝试了下面的代码javascript嵌套函数和变量,javascript,nested,Javascript,Nested,上面的代码无效,所以我尝试了下面的代码 function GetMe(id) { DB.transaction( function (transaction) { transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], function (transaction, results) { if(results.rows.length > 0) {
function GetMe(id) {
DB.transaction(
function (transaction) {
transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], function (transaction, results) {
if(results.rows.length > 0) {
var row = results.rows.item(0);
return row.name;
}
}, errorHandler);
}
);
}
alert(GetMe(1)); // id 5 exists in users table and alert shows empty
上面的代码应该可以很好地工作,但它没有我不知道它有什么问题,我几乎尝试了一切
有人能告诉我出了什么问题并帮我解决吗?谢谢:)这看起来是因为
DB.transaction
是异步的。您需要做的是将回调函数
传递给您的GetMe()
函数
,例如
function GetMe(id) {
var retval;
DB.transaction(
function (transaction) {
transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], function (transaction, results) {
if(results.rows.length > 0) {
var row = results.rows.item(0);
retval = row.name;
//alert('IN ' + retval); //works
}
}, errorHandler);
}
);
//alert('OUT ' + retval); // undefined
return retval; // undefined
}
alert(GetMe(1)); // undefined
然后修改GetMe
,如下所示:
GetMe(1, function (data) {
});
问题不在于嵌套函数,而是内部函数(传递到
transaction.executeSql
中的函数)在您认为它执行时没有执行。顺序更像以下内容:
row.name
,但返回结果为nothing,程序的其余部分在log-ago之前继续运行function GetMe(id, callback) {
DB.transaction(function (transaction) {
transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], function (transaction, results) {
if(results.rows.length > 0) {
var row = results.rows.item(0);
callback.call(null, row.name);
}
}, errorHandler);
});
}
从异步回调函数返回值是没有意义的。您误解了异步JavaScript编程的一个基本方面。@Pushpak我不相信这个问题的答案是正确的。
function UpdateMe(){var data=GetMe();DB.transaction(//更多使用变量数据的事务和查询);}
@beeglebug这就是我试图做的事情,从函数GetMe()
中获取数据,然后在另一个函数中使用它进行其他更新这件事将在脚本中使用GetMe()
大约20次,我不想重复,需要保持小而灵活。因此,我认为您的GotMe()
不是一个解决方案,因为我会将数据用于各种目的,或者是否有方法从GotMe()
获取数据,可能是我的所有其他函数。。
// inside GetMe
transaction.executeSql("SELECT * FROM users WHERE id = ?", [id], GotMe);
// outside, in the same scope as GetMe
function GotMe(transaction, results) {
// do your stuff here
}