-1

我想返回来自 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,但这并没有解决问题。有人对此有什么建议吗?

问候,

4

3 回答 3

1

好吧,我会说这种方法是错误的。

返回数据在这里没有意义。可能您想要做的是将“脚步”交给外部功能。但是,当内部函数执行时,外部函数已经完成。无论你想对足迹做什么,你都必须从内部功能开始。即使外部函数已经完成,您仍然可以访问在外部函数上下文中定义的所有变量。也许这有帮助。

阅读有关回调和关闭的信息。我可以推荐的内容是来自 O'Reilly 的“JavaScript 模式”或来自 Douglas Crockford 的任何内容。

于 2013-05-12T11:16:28.523 回答
0

这就是我的想法:

首先是函数本身,它接受一个回调,我将传递给 Defferred 的 .then:

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');
            },
于 2013-06-12T11:15:37.500 回答
0

您实际上可以使用延迟对象。创建延迟对象并让感兴趣的代码监听它。然后,进行操作。操作完成后,解析延迟对象,将数据传递给它。延迟的所有侦听器都将在解析期间接收数据。

于 2013-05-12T11:05:38.297 回答