indexeddb - 索引数据库是否进行并行处理?

标签 indexeddb

在 IE11 和 Chrome 中的索引数据库代码中,我有一个这样的函数来管理缓存。但我所做的是,我对缓存上的过期键(可能是多个)发出一堆删除命令,然后发出读取命令来读取内容(也可能是多个) 从缓存中。删除和读取都是异步的。这些命令是一个接一个同步发出的,例如删除、删除、删除……,然后读取、读取、读取……我不会在任何内容的回调中链接任何内容。

我想要的是,如果我删除一个名为 A 的键,然后读取一个名为 A 的键(这不在删除命令的回调中,就在之后同步),我读取的值应始终为 null 或未定义。

由于异步编程的本质,读取命令是否可以在对同一键执行删除命令之前读取某些内容?或者他们是否执行某种单一处理队列系统,其中所有任务一次完成 1 个,以便确保删除发生在任何读取之前?

    function deleteExpiredItems(callback) {
        console.info("Clearing expired items now.");

        dbEnumerator(function(key, value, expired) {
            if (expired) {
                console.warn("Key " + key + " expired and is being deleted because it expired.");
                remove(key);
            }
        }, callback);
    }

    function dbEnumerator(itemProcessor, callback) {
        if (db) {
            var transaction = db.transaction([store_NAME], IDBTransaction_READ_ONLY); 
            var objectStore = transaction.objectStore(store_NAME);
            var cursorRequest = objectStore.openCursor();

            cursorRequest.onsuccess = function (event) {
                if (event.target.result) {
                    var val = event.target.result.value.value;
                    var key = event.target.result.value.id;
                    var expired = isCacheExpired(val[1], val[2]);
                    itemProcessor(key, val, expired);
                    event.target.result['continue']();
                }
            };

            transaction.oncomplete = function (event) {
                callback(event);
            };
        } else {
            console.warn("Cannot enumerate on database when it is not set.");
        }
    }

最佳答案

在事务中,请求始终按照发出的顺序进行处理。

var tx = db.transaction('my_store', 'readwrite');
var store = tx.objectStore('my_store');

var r1 = store.delete(key);
r1.onsuccess = e => console.log('deleted');

var r2 = store.get(key);
r2.onsuccess = e => console.log('got: ' + r2.result);

删除请求首先发出,并且将首先执行。所以get请求总是会导致未定义的结果。

关于indexeddb - 索引数据库是否进行并行处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40186106/

相关文章:

javascript - IndexedDB 打开数据库请求奇怪的行为

indexeddb - 索引数据库 - 一个或另一个匹配的复合索引查询

postman - (closed) Postman无法正常打开

javascript - 如何从 IndexDB 中获取 Firebase Auth token 以进行 Ajax 调用

asynchronous - 是否有 Service Worker 启动 waitUntil 来延迟处理获取?

javascript - IndexedDB 支持类似 SQL 的事务吗?

javascript - 面临 CORS 错误

javascript - 如何在 indexedDB 上创建列/对象

javascript - indexedDB get() 方法中 'Number()' 的用途是什么

javascript - 未找到错误: DOM IDBDatabase Exception 8 when creating transaction in indexedDB