如何同步遍历 indexedDB 表?

Raj*_*esh 4 html indexeddb

我想在 JS 中编写一个函数,我将循环遍历索引数据库中的表并获取上次修改的表的最大值并返回

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

IMP--既然 onsuccess 方法是异步的,我怎样才能使它同步?这样我的方法 readData() 只会在成功找到最大最后修改记录时返回。如果需要,我可以同步调用此方法 (readData()) 以获取 2-3 个表的最后修改记录。

Kri*_*ave 5

同步 API 仅在 webworker 中可用。所以这将是第一个要求。(据我所知,目前只有 IE10 支持这个)

您可以提供的另一个方法是使用 JS 1.7 并使用 yield 关键字。有关它的更多信息,请看这里

我建议使用当您达到最新值时调用的 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); 
   }
} 
Run Code Online (Sandbox Code Playgroud)

  • 没有浏览器实现同步 API,即使在 Web Worker 中也是如此。AFAIK,只有 chrome 才支持 web worker 中的 indexeddb,这只是异步 API。 (2认同)
  • 这将不起作用,因为在游标上的成功事件中声明了变量 maxKey,每次游标继续时都会调用该事件。我已提交对您的代码的编辑,请查看。 (2认同)