做索引db做并行处理



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

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

由于异步编程的性质,read命令是否可能在delete命令发生在同一键之前读取某些内容?或者他们是否采用某种单一处理队列系统,其中所有任务一次完成一个,从而确保在读取之前执行删除操作?

    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请求的结果总是undefined

最新更新