从异步函数
问题描述:
获取数据我有这样的代码:从异步函数
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
工作异步,但我使用回调来返回数据。有人可以解释为什么它不工作,以及如何解决这个问题?
答
标准的方式做,这是包括您自己的回调,像这样:
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 */
});
答
你不返回任何异步操作的结果,而不是你听吧。
在你的代码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;
});
那么,有没有办法,把该数组放在一个变量以外的异步函数? – nukl
@nukl:您可以将值分配给任何更高范围的变量(例如全局变量),但这对您没有帮助。当使用回调时,重要的一点是*数据被访问时*。如果您在执行回调(并设置该值)之前访问变量*,则会出现错误或无数据。在回调之外,有一些非常有效的用例来分配对其他变量的响应,但是您必须了解进行异步调用的含义。 –
@nukl,除非你想使用CoffeeScript(一种JavaScript编译语言):http://jashkenas.github.com/coffee-script/ –