0

readwrite トランザクションを使用して (Chrome で) IndexedDB に put を実行し、すぐにインデックスと readonly トランザクションを使用して同じ indexedDB オブジェクトストアからクエリを実行する js があります。返される結果には、プットからの変更が含まれていない場合もあれば、変更が含まれている場合もあります。IndexedDB でこの種のダーティな準備ができていると予想されますか? それを回避する方法はありますか?

おそらく、私は 2 つの異なる txn を使用しており、1 つだけを使用する必要があるためです (その理由は、これらの呼び出しが実際には、プットとクエリをそれぞれ独自の txns を持つ異なる API 呼び出しに分離する API の一部であるためです)? それでも、2 番目の txn が開始される前に、最初の txn を実行してコミットする必要があるようです。

私の疑似コードは次のようになります。

var txn = idb.transaction([DOC_STORE], "readwrite");
var putRequest = txn.objectStore(DOC_STORE).put(myDoc);
putRequest.onsuccess = function (e) {
    var txn2 = idb.transaction([DOC_STORE], "readonly");
    var store = txn2.objectStore(DOC_STORE);
    var anotherRequest=store.index.openCursor();
    .... walk the cursor here. Sometimes I don't see my changes from my put
};
4

1 に答える 1

2

書き込みトランザクションが完了するまで待つ必要があります。リクエスト成功イベントよりも遅れてやってくる。

var txn = idb.transaction([DOC_STORE], "readwrite");
var putRequest = txn.objectStore(DOC_STORE).put(myDoc);
txn.oncomplete = function (e) {
    var txn2 = idb.transaction([DOC_STORE], "readonly");
    var store = txn2.objectStore(DOC_STORE);
    var anotherRequest=store.index.openCursor();
    .... walk the cursor here. You will see see your all changes from your put
};

または、同じトランザクションでリクエストの成功を使用できます。

var txn = idb.transaction([DOC_STORE], "readwrite");
var putRequest = txn.objectStore(DOC_STORE).put(myDoc);
putRequest.onsuccess = function (e) {
    var store = txn.objectStore(DOC_STORE);
    var anotherRequest=store.index.openCursor();
    .... walk the cursor here. You will see see your all changes from your put
};
于 2013-03-06T07:04:06.197 に答える