0

我有一些 js 使用 readwrite 事务对 IndexedDB(在 Chrome 中)执行 put,然后立即使用索引和 readonly 事务从同一个 indexedDB objectstore 查询。有时,我得到的结果不包括我的看跌期权和其他时候的变化。在 IndexedDB 中是否可以预料到这种脏东西?有没有办法避免它?

也许是因为我使用了 2 个不同的 txns 并且应该只使用一个(原因是这些调用实际上是 api 的一部分,它将 put 和 query 分成不同的 api 调用,每个调用都有自己的 txns)?尽管如此,似乎第一个 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 回答