我有这段代码:
function getData(){
db.transaction(function(tx){
tx.executeSql('SELECT * from q', [], function(tx, result){
var q = [];
for (var i=0; i < result.rows.length; i++) {
q.push(result.rows.item(i));
};
console.log(q.length); // 3
returnData(q);
});
});
}
function returnData(data){
console.log(data.length); // 3
return data;
}
var q = getData(); // undefined
并且它不能按预期工作(它不会返回任何内容)。假设发生了,因为db.transaction
工作异步,但我正在使用回调来返回数据。有人可以解释为什么它不起作用以及如何解决这个问题?
答案 0 :(得分:6)
执行此操作的标准方法是包含您自己的回调,如下所示:
function getData(callback){
db.transaction(function(tx){
tx.executeSql('SELECT * from q', [], function(tx, result){
var q = [];
for (var i=0; i < result.rows.length; i++) {
q.push(result.rows.item(i));
};
console.log(q.length); // 3
callback(returnData(q));
});
});
}
function returnData(data){
console.log(data.length); // 3
return data;
}
getData(function(q) {
/* do something with q */
});
答案 1 :(得分:0)
您不会返回任何异步操作的结果,而是您会收听它。
在你的代码中returnData
会返回数据,但你没有对结果做任何事情,它被丢弃了。相反,您应该使用自己的回调。
function getData(callback){
db.transaction(function(tx){
tx.executeSql('SELECT * from q', [], function(tx, result){
var q = [];
for (var i=0; i < result.rows.length; i++) {
q.push(result.rows.item(i));
};
console.log(q.length); // 3
callback(q);
});
});
}
var q;
getData(function(data) {
console.log(data.length); // 3
console.log(data);
doStuffWith(data);
q = data;
});