在触发事件的方法调用之后设置JavaScript事件处理程序?

在触发事件的方法调用之后设置JavaScript事件处理程序?,javascript,javascript-events,indexeddb,Javascript,Javascript Events,Indexeddb,在查看IndexedDB API时,我发现了几个在方法调用之后设置的事件处理程序示例,这些示例看起来应该触发事件: 虽然我已经用JavaScript做了很多开发,但我很不好意思说这对我来说很奇怪。我觉得应该在实际的open()调用之前设置事件处理程序,但我在几个示例中看到了这种模式。有人能帮我理解这一点吗?可能是因为打开是异步的,并且有一些延迟(打开不是立即完成的)。与此同时,JavaScript继续执行(并绑定事件)。打开数据库似乎只是一个打开的过程。它不是一个实际的DB请求,onsucces

在查看IndexedDB API时,我发现了几个在方法调用之后设置的事件处理程序示例,这些示例看起来应该触发事件:


虽然我已经用JavaScript做了很多开发,但我很不好意思说这对我来说很奇怪。我觉得应该在实际的open()调用之前设置事件处理程序,但我在几个示例中看到了这种模式。有人能帮我理解这一点吗?

可能是因为打开是异步的,并且有一些延迟(打开不是立即完成的)。与此同时,JavaScript继续执行(并绑定事件)。

打开数据库似乎只是一个打开的过程。它不是一个实际的DB请求,onsuccess处理程序用于后面的实际数据库请求


最好在调用事件处理程序之前安装它们,但是在这种情况下,
dbOpenRequest
对象在open调用之后才存在(它作为open调用的结果返回),因此在open调用之后才可以在其上放置
onsuccess
处理程序。因此,
onsuccess
处理程序必须在一段时间后被调用,作为对open(可能是DB查询)以外的事件的响应,或者根本不被调用。

这是JavaScript的单线程和异步性质的原因。调用open时,函数将立即执行。但是onsuccess回调将放在单个线程的函数堆栈上。在实际函数结束之前,不能调用这些函数。因此,您可以更改函数中的请求对象,并且在调用onsuccess时回调就在那里。这篇文章很好地理解了执行上下文堆栈

var db = null;
try {
  var dbOpenRequest = window.indexedDB.open("BookShop1");
  dbOpenRequest.onsuccess = function(event){
    db = dbOpenRequest.result;
    DAO.version = db.version;
    ...