从函数内的函数返回数据

时间:2013-05-12 11:03:42

标签: javascript scope

我想在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,但这并没有解决问题。有没有人对此提出建议?

格尔茨,

3 个答案:

答案 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');
            },