我有这个js类,它有一个匿名函数来检索一些查询结果。由于处理结果的函数是匿名的,我无法将结果保存在this.var变量中,并在其他地方使用它们,因为这在匿名函数中引用了window对象。我不能将它作为函数返回它返回,那么如何处理这些结果以使它们在其他地方可用?
someObject = {
// this.db is created, no need to paste that code
dbGetAnimals: function () {
this.db.readTransaction(function(tx) {
tx.executeSql("SELECT * FROM animals", function(tx, results){
return results;
} )
});
},
printAllAnimals: function () {
var animals = this.dbGetAnimals();
alert (animals);// undefined
}
}
someObject.printAllAnimals();
答案 0 :(得分:3)
您可以创建一个本地变量来保存this
引用。您的匿名函数将成为闭包,因此它将能够看到本地变量。
dbGetAnimals: function () {
var myself = this;
this.db.readTransaction(function(tx) {
tx.executeSql("SELECT * FROM animals", function(tx, results){
myself.var = results;
} )
});
},
答案 1 :(得分:2)
您正在尝试进行传统的同步/非阻塞编程,以便进行异步编程。
var someObject = function()({
this.dbGetAnimals = function (callback) {
db.readTransaction(function(tx) {
tx.executeSql("SELECT * FROM animals", function(tx, results){
callback(results);
} )
});
},
this.printAllAnimals = function (callback) {
this.dbGetAnimals(callback);
}
})();
someObject.printAllAnimals(function(animals) {
alert(animals);
}
有更简洁的方法可以做到这一点,但对于异步编程,你必须学会在回调上做所有事情而不是直接返回。
答案 2 :(得分:0)
这种情况正在发生,因为executeSql
中的匿名函数是一个回调函数,在查询完成之前不会执行,根据定义,它将在dbGetAnimals
返回之后执行。这就是你对dbGetAnimals
的调用未定义的原因。
您必须传递一个回调函数才能从executSql
回调中接收查询结果:
someObject = {
// this.db is created, no need to paste that code
dbGetAnimals: function (callback) {
this.db.readTransaction(function(tx) {
tx.executeSql("SELECT * FROM animals", function(tx, results){
callback(results);
} );
});
},
printAllAnimals: function () {
this.dbGetAnimals(function(animals) {
alert(animals)
});
}
}
someObject.printAllAnimals();