2012-08-23 76 views
3

我想要寫在JS的功能,我將通過我的索引數據庫表一環,並得到修改後的表中的最後一個最大值,並返回如何同步循環訪問indexedDB表?

function readData(){ 
    var trans = ''; 
    trans = idb.transaction(["tableName"],'readonly'); // Create the transaction 
    var request = trans.objectStore("tableName").openCursor(); 
    request.onsuccess = function(e) { 
     var cursor = request.result || e.result; 
     if(cursor) { 
      // logic to and find maximum 
     } else { 
      return // max last modified 
     } 
     cursor.continue(); 
    } 
} 

IMP - 由於的onSuccess方法是異步如何我可以讓它同步嗎?這樣我的方法readData()只有當最後一個修改記錄被成功找到時纔會返回。如果需要,我可以同步調用此方法(readData())以獲取2-3個表的最後修改記錄。

回答

4

同步API僅適用於webworker。所以這將是第一個要求。 (據我所知,目前只有IE10支持此功能)

另外一個鏡頭是你可以使用JS 1.7並使用yield關鍵字。欲瞭解更多關於它的信息,請看here

我會強制使用您在達到最新值時調用的callbakck方法。

function readData(callback){  
    var trans = '';   
    trans = idb.transaction(["tableName"],'readonly'); //Create the transaction 
    var request = trans.objectStore("tableName").openCursor(); 
    var maxKey;  
    request.onsuccess = function(e) { 
     var cursor = request.result || e.result;    
     if(cursor.value){    
      //logic to and find maximum 
      maxKey = cursor.primaryKey    
      cursor.continue(); 
     } 
    } 
    trans.oncomplete = function(e) { 
     callback(maxKey); 
    } 
} 
+2

即使在網絡工作者中,沒有瀏覽器實現同步API。 AFAIK,只有chrome支持web worker中的indexeddb,這就是async API。 – dgrogan

+2

這不會起作用因爲maxKey在遊標上的成功事件中被聲明,每當遊標繼續時被調用。我已提交編輯到您的代碼請檢查它。 –

+0

你是對的,tnx編輯。 –

1

頂部框架中的IndexedDB API是異步的。異步不能同步。但是您可以在單個交易中讀取所有表格。

+0

我如何讀取單個事務中的所有表?請發表一個例子..我會很感激.. – Rajesh

+0

爲所有商店開放'trans','db.transaction(db.objectStoreNames,IDBTransaction.readonly)',通過反覆打開商店讀取數據'trans.objectStore(db.objectStoreNames [我])。openCursor()'trans將不會提交,直到你完成。只要你在事務內同步運行,它就應該工作,我沒有想過。 –