4

インデックス付きDBのテーブルをループし、テーブルの最終変更の最大値を取得して返す関数を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();
    }
}

IMP -- onsuccess メソッドは非同期なので、どうすれば同期化できますか? 私のメソッド readData() は、最後に変更された最大レコードが正常に見つかった場合にのみ返されるようにします。必要に応じて、このメソッド (readData()) を同期的に呼び出して、2 ~ 3 個のテーブルの最後に変更されたレコードを取得できます。

4

2 に答える 2

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); 
   }
} 
于 2012-08-23T13:20:38.857 に答える
1

トップフレームのIndexedDBAPIは非同期です。asyncを同期することはできません。ただし、1回のトランザクションですべてのテーブルを読み取ることができます。

于 2012-09-03T16:44:56.857 に答える