我看到有时在执行indexedDb.open()时,没有事件被触发。 如果我设置超时并观察openRequest的状态,就绪状态设置='完成'。如果我在openRequest.result的db上做任何事务,它就可以正常工作。indexedDb没有事件在开启时触发
我的猜测是,在某些情况下,openRequest执行完成后才会附加'onsuccess'或其他事件处理程序,换句话说,它不会在下一个事件循环中执行。
所以,如果没有事件发生,我可以在'x'时间后检查状态。然而,这种方法是骇人而脆弱的。 有谁知道更好的方法来解决这个问题?
var db;
var openRequest = window.indexedDB.open("todos", 1);
openRequest.onerror = function(event) {
console.error('error in open', event);
};
openRequest.onsuccess = (event) => {
console.log('success ' , event)
};
openRequest.onupgradeneeded = (event) => {
console.log('upgradeneeded ' , event);
db = event.target.result;
db.createObjectStore("toDoList", { keyPath: "taskTitle" });
};
openRequest.onblocked = (event) => {
console.log('blocked ' , event);
};
setTimeout(() => {
console.log('timeout');
console.log(openRequest.readyState) // equals done
}, 10000)
为什么使用全局数据库变量?而且,为什么你只需要在onupgradeneeded函数中为db赋值呢? – Josh
这段代码只是简单的记录语句。数据库也将从成功处理程序中设置。 – sbr