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

uoifb46i  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(3)|浏览(206)

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

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

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

btxsgosb

btxsgosb1#

这是JavaScript的单线程和异步特性造成的。当你调用open时,函数会立即执行。但是onsuccess回调会放在单线程的函数栈上。这些函数在实际函数结束之前不能被调用。所以你可以改变函数中的request对象,当调用onsuccess时回调就在那里。This是了解执行上下文堆栈的好文章。

33qvvth1

33qvvth12#

看起来打开数据库只是一个open,它不是一个实际的DB请求,onsuccess处理程序是用于稍后到来的实际数据库请求的。
在可能调用事件处理程序之前安装它们是一种好的做法,但在这种情况下,dbOpenRequest对象直到open调用之后才存在(它是作为open调用的结果返回的),因此在open调用之前无法在其上放置onsuccess处理程序。onsuccess处理程序必须在一段时间后作为对open以外的某个事件(可能是DB查询)的响应而被调用,或者根本不被调用。

8ljdwjyq

8ljdwjyq3#

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

相关问题