2

在查看 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() 调用之前设置事件处理程序,但我已经在几个示例中看到了这种模式。有人可以帮我理解这一点吗?

4

3 回答 3

2

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

于 2012-02-05T21:47:47.877 回答
1

看来,打开数据库只是一个打开。这不是一个实际的数据库请求,并且 onsuccess 处理程序用于稍后出现的实际数据库请求。

最好在可能调用事件处理程序之前安装它们,但在这种情况下,dbOpenRequest对象在 open 调用之后才存在(它作为 open 调用的结果返回),因此无法放置onsuccess处理程序就可以了,直到打开之后。因此,onsuccess必须在一段时间后调用处理程序作为对打开(可能是数据库查询)以外的某些事件的响应,或者根本不调用处理程序。

于 2012-02-05T21:47:17.090 回答
0

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

于 2012-02-05T21:31:17.407 回答