我想在javascript中返回来自sqlite查询的数据。问题如下:
App.dbInstantion.transaction(function(tx){
tx.executeSql('SELECT * FROM footsteps', [],
function(tx, results) {
for (var i = 0; i < results.rows.length; i++) {
footsteps.push(results.rows.item(i));
}
//WRONG RETURN SCOPE
return footsteps;
}, self.errorCB
);
}, self.errorCB);
//FOOTSTEPS IS NOT FILLED YET SO AN EMPTY ARRAY IS RETURNED
return footsteps;
我尝试使用$.Deferred
,但这并没有解决问题。有没有人对此提出建议?
格尔茨,
答案 0 :(得分:1)
嗯,我会说这种做法是错误的。
返回数据在这里没有意义。您可能想要做的是将“脚步”移交给外部功能。但是,到内部函数执行时,外部函数已经完成。无论你想用脚步做什么,都必须从内部功能中做到。即使外部函数已经完成,您仍然可以访问在外部函数的上下文中定义的所有变量。也许这有帮助。
了解回调和关闭。我可以推荐的内容是来自O'Reilly的“JavaScript Patterns”或来自Douglas Crockford的任何内容。
答案 1 :(得分:0)
您实际上可以使用延迟对象。创建延迟对象并让感兴趣的代码听取它。然后,做手术。操作完成后,解析延迟对象,并将数据传递给它。延迟的所有听众都将在解决期间收到数据。
答案 2 :(得分:0)
这就是我弄清楚的:
首先是函数本身,它接受一个回调函数,然后我将对Defferred的函数进行处理:
functionName: function(callback, param1, param2) {
var self = this;
var data = function getData(){
var dfd = $.Deferred();
App.dbInstantion.transaction(function(tx){
tx.executeSql('SELECT * FROM blabla',
[], dfd.resolve, self.errorCB
);
}, self.errorCB);
return dfd.promise();
}
//return deferred is done(.then) function with the sent callback to this function
return data().then(callback);
},
然后我像这样使用它:
initialize: function() {
functionName(this.passedCallback);
},
passedCallback: function(tx, results) {
// I got the results of the query here!
window.footsteps = [];
for (var i = 0; i < results.rows.length; i++) {
window.footsteps.push(results.rows.item(i));
}
//trigger backbone custom event to deal with async problems
App.Vent.trigger('retrievingFootsteps:done');
},