我有一个简单的函数来计算数据库中的行数并返回结果。但是我得到的结果是未定义的,即使我在console.log中结果它是从函数中正确出现的。这是我正在做的事情的要点,虽然我已经删除了很多代码来简化它。
$('#roomsList').append(getCount(currentRow.roomtype));
function getCount(roomtype) {
var query = "SELECT COUNT(*) FROM fixturesfittings WHERE roomtype = ?;"
localDatabase.transaction(function (trxn) {
trxn.executeSql(query, [propertyid,roomtype],function (transaction, results) {
return results.rows.item(0)["COUNT(*)"];
},errorHandler);
});
}
任何人都可以帮助我吗?
答案 0 :(得分:1)
问题是localDataBase.transaction
和exequteSql
是异步函数。他们不会立即得到答案,这就是你将这些功能传递给他们的原因。一旦他们得到答案,他们就会调用你的函数,称为回调函数。这将发生在执行周期的后期,getCount
早已过去。
所以getCount
调用localDatabase.transaction
,它开始工作但没有任何可用的内容,因此getCount
在数据可用之前完成,因此getCount
是返回undefined(JavaScript函数中的默认返回值)。
您可能需要将代码重写为以下内容:
getCount(function(count) {
$('#roomsList').append(count);
});
function getCount(callback) {
var query = '...';
localDatabase.transaction(function(trxn) {
trxn.exequteSql(query, ... function(transaction, results) {
callback(results);
});
}
}
这是一种非常常见的JavaScript模式,它有很多陷阱和奇怪之处。这需要一些时间来适应。
答案 1 :(得分:0)
你正在做的事情有两个同样严重的问题:
您的外部功能不会返回任何内容。代码中唯一的return
语句是从传递给localDatabase.transaction
的内部函数返回。
这样的事情:
function myFunction
inner_function = function () {
return 3; # Return from inner function, *not* myFunction
}
}
即使 试图将内部函数中的值传递给外部函数,然后从外部函数返回,它仍然无效;内部函数是异步调用的。在return results...
完成执行并返回getCount
之后很久,将在某个时间点调用内部undefined
。你需要将某种形式的回调传递给getCount
;稍后将调用回调并传递计数。想一想:
function myFunc(callback) {
function inner_function = function(callback) {
// Invoke our callback sometime in the future
setTimeout(1000, callback);
}
// Inner function does some processing at some future time;
// give it a callback to invoke when its processing is done
inner_function(callback);
}