2013-05-12 63 views
-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但這並沒有解決問題。有沒有人有這個建議?

Greetz,

+0

看看[如何從AJAX調用返回響應?](http://stackoverflow.com/q/14220321/218196)。即使它不是Ajax,解決方案也是一樣的。如果推遲對象/承諾不適合你,你錯誤地使用了它們。 – 2013-05-12 11:04:48

+0

感謝您的建議 – 2013-05-12 11:06:29

回答

0

您實際上可以使用延遲對象。創建延遲對象並讓感興趣的代碼監聽它。然後,執行操作。一旦操作完成,解析延遲對象並將數據傳遞給它。所有延期的聽衆將在解決期間收到數據。

1

那麼我會說這種方法是錯誤的。

返回數據在這裏沒有意義。可能你想做的是將「腳步聲」交給外部功能。但是,當內部函數執行時,外部已經完成了。無論你想要用腳步來做什麼,你都必須從內在功能來做。即使outher函數已經完成,您仍然可以訪問在外部函數的上下文中定義的所有變量。也許這有幫助。

閱讀回調和關閉。我可以推薦的內容是來自O'Reilly的「JavaScript模式」或道格拉斯克羅克福德的任何內容。

0

這是我想通了:

一是本身的功能,它接受一個回調,我將考績TOT的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'); 
      },