在IE11和chrome中的索引数据库代码中,我有一个这样的函数来管理缓存。但我所做的是,我在缓存上的过期密钥(可能是多个)上发出一堆删除命令,然后我发出读取命令来读取内容(也可以是多个< / strong>)来自缓存。删除和读取都是异步的。这些命令是一个接一个地同步发出的问题,如删除,删除,删除,......,然后读取,读取,读取......我不会在任何回调中链接任何东西。
我想要的是,如果我删除一个名为A
的密钥,然后读取一个名为A
的密钥(这不是在删除命令的回调中,只是同步后),我读取的值应始终为null或undefined。
由于异步编程的性质,读取命令是否可能在删除命令发生之前读取相同的键?或者他们是否进行某种单处理队列系统,其中所有任务一次完成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.");
}
}
答案 0 :(得分:2)
在一个事务中,请求总是按照它们的顺序处理。
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请求总是会导致未定义。