0

我看到有时在执行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) 
+0

为什么使用全局数据库变量?而且,为什么你只需要在onupgradeneeded函数中为db赋值呢? – Josh

+0

这段代码只是简单的记录语句。数据库也将从成功处理程序中设置。 – sbr

回答

1

无论是"success"或当readyState成为"done""error"事件必须开火。如果这没有发生,那么你已经发现了一个浏览器错误。

正如注释中所述,您还需要db = event.target.result位于onsuccess处理程序中,否则在不需要升级时不会设置db。你确定这不是你错误的根源吗? (即可能success射击,你只是没有捕捉结果?)

在某些情况下,openRequest执行完毕之前,我们得到重视“的onSuccess”或其他事件处理程序

如果发生了这将是一个浏览器错误。你是否看到跨浏览器的一致行为?你能可靠地重现吗?

+0

我看到这种行为,在铬,边缘,Safari浏览器和Firefox。不幸的是没有重复步骤。 – sbr

+0

您看到的行为不是预期的。您的代码中可能存在一个错误;没有看到你的实际代码,就很难提出进一步的建议。 –