2012-08-28 49 views
0

我正在使用phonegapjQueryjQuery mobile構建移動應用程序。我想在我的應用程序中使用SqLite數據庫來存儲一些用戶信息。 (我不能使用local storage我想要做的搜索/排序操作上的數據)如何返回此值?

這是我工作的代碼來完成這件事,

function getAccountInformation(){ 
    var accounts = {}; 
    db.transaction(function(transaction) { 
     transaction.executeSql('SELECT * FROM account;', [], 
      function(transaction, result) { 
       if (result != null && result.rows != null) { 
        for (var i = 0; i < result.rows.length; i++) { 
         var item={}; 
         var row = result.rows.item(i); 
         for(var prop in row){ 
          item[prop]=row[prop] 
         } 
         accounts[i]=item; 
        } 
       } 
      },errorHandler 
     ); 
    },errorHandler,nullHandler); 
    console.log(JSON.stringify(accounts)); 
} 

如果我把這個console.log(JSON.stringify(accounts));for loop結束}它顯示正確的輸出。

但是,如果我把它放在現在的位置,{}將被打印爲輸出。

我該如何讓getAccountInformation()函數返回accounts對象到我的其他函數?我將在哪裏使用jQuery來渲染輸出。

我想要做的就是簡單地wrting return accounts;

+0

你的其他功能是什麼? – mabbas

+0

它只是一個簡單的函數,我將使用'for in'循環遍歷這個返回的對象,以便將新元素添加到'DOM'。它與這個問題無關:) – AdityaParab

+0

你可以簡單地在'for'循環結束'}後調用另一個函數。例如:'otherFunction(賬戶);' – mabbas

回答

1

因爲SqLite函數是異步的,所以不能只返回值。

我會使getAccountInformation接收如下回調:

function getAccountInformation(callbackfn) 
{ 
    db.transaction(function(transaction), 
     ....., 
     function (transaction, result) 
     { 
      if (result != null) 
      { 
       callbackfn(result); 
      } 
     }); 
} 

在這種方式DB請求執行時,你會得到你叫功能。

+0

我明白:)... Callbackfn並不總是相同的。它會根據場景而改變。元素在每個頁面上顯示的方式各不相同。所以我只是想以某種方式獲取這個對象。或者我必須重新設計整個事情:( – AdityaParab

+0

好吧.. .GOT它...有意義:) – AdityaParab

+0

感謝,用你的方法解決它。 :) 只是一個更正。你不能調用回調函數爲'callbackfn(結果)' 由於我們傳遞函數的字符串名,就必須使用它像 '窗口[callbackfn](結果);' – AdityaParab

1

這取決於當函數被調用的返回此accounts對象。當它被異步調用(如AJAX請求)時,你運氣不好。在這種情況下,我建議你閱讀有關jQuery deferreds

基於deferreds的代碼段看起來是這樣的:

var deferred = new jQuery.Deferred(); 
var accounts = {}; 

deferred.done(function(data) { 
    // process your data here 
}); 

db.transaction(function(transaction) { 
    transaction.executeSql('SELECT * FROM account;', [], 
     function(transaction, result) { 
      if (result != null && result.rows != null) { 
       for (var i = 0; i < result.rows.length; i++) { 
        var item={}; 
        var row = result.rows.item(i); 
        for(var prop in row){ 
         item[prop]=row[prop] 
        } 
        accounts[i]=item; 
       } 
       deferred.resolve(accounts); // let the "done" function get called 
      } else { 
       deferred.reject(); 
      } 
     }, errorHandler 
    ); 
},errorHandler,nullHandler); 
+0

我試過了,但沒有運氣。在調用函數,我仍然收到它作爲'undefined' – AdityaParab

0

db.transactiontransaction.executeSql生成其結果異步通過使用回調函數。這意味着您的getAccountInformation函數將立即返回,並且不會等待事務完成(如在同步調用中)。

簡單地傳入回調函數作爲您的getAccountInformation的參數並在填充accounts數組時運行該函數可能更容易。因此,你的函數簽名更改爲getAccountInformation(callback),取而代之的executeSql回調:

 function(transaction, result) { 
      if (result != null && result.rows != null) { 
       for (var i = 0; i < result.rows.length; i++) { 
        var item={}; 
        var row = result.rows.item(i); 
        for(var prop in row){ 
         item[prop]=row[prop] 
        } 
        accounts[i]=item; 
       } 
       callback(accounts); // Call callback function with populated accounts 
      } 
     } 

然後,您可以調用這個函數:

getAccountInformation(function(accounts) { 
    // Do something with the accounts 
}); 

有票友方式如jQuery Deferreds,並承諾這使得工作與異步功能更容易,但你仍然需要了解爲什麼這存在。通過使用異步操作,您的應用程序在等待結果時保持響應。