-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

実際に遅延オブジェクトを使用できます。遅延オブジェクトを作成し、関心のあるコードにリッスンさせます。その後、操作を行ってください。操作が完了したら、遅延オブジェクトを解決し、データを渡します。その遅延に対するすべてのリスナーは、解決中にデータを受け取ります。

于 2013-05-12T11:05:38.297 に答える
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 に答える