1

我有一个关于 JavaScript 函数的问题。

例如,请参考以下代码。

  • 在前 2 行中,我打开了一个 indexedDB。
  • 之后,我将 onsuccess 函数附加到 openRequest。
  • 警报正确出现。

我假设“打开”功能会触发“成功”事件功能。但是,由于在调用 'open' 函数之后,'success' 函数附加到 openRequest 上,这怎么能工作呢?

var indexedDB = window.indexedDB;
var openRequest = indexedDB.open('MyTestDB');
openRequest.onsuccess = function (response) {
    alert('sucess');
};
4

3 回答 3

5

调用indexDB.open是异步的。它立即返回,其余代码继续运行。当数据库实际打开时,会触发一个事件。该事件被放置在事件队列中。JavaScript 解释器会定期检查事件队列。但是解释器也是单线程的。它不会跳出正在执行的当前代码来检查它。onsuccess 函数在定义之前永远不会被调用。事实上,数据库本身也永远不会被打开,直到以后。

例如,如果您在代码末尾放置一个无限循环,则 onsucess 函数将永远不会运行。

var indexedDB = window.indexedDB;
var openRequest = indexedDB.open('MyTestDB');
openRequest.onsuccess = function (response) {
    alert('sucess');
};

while (true) {};

此时执行将被阻止,解释器永远不会检查事件队列,也永远不会运行 on success 函数。

http://javascript.info/tutorial/events-and-timing-depth

于 2013-11-02T11:33:44.197 回答
2

这是可能的,因为 JavaScript VM(以 V8 为例)执行成功处理程序的分配比打开 indexDB 更快。这是由于调用indexedDB.open()是异步的,因此 VM 在后台打开 DB执行事件处理程序分配。

如果您延迟分配事件处理程序,您将看到它不再被调用:

→ jsFiddle

var indexedDB = window.indexedDB;
var openRequest = indexedDB.open('MyTestDB');

window.setTimeout(function () {
    openRequest.onsuccess = function (response) {
        alert('sucess');
    };
}, 1); // also test higher values - 1ms worked fine for me

另请阅读上面aychedee的答案

于 2013-11-02T11:06:05.857 回答
0

indexedDB.open在后台发出异步请求。当它准备好时,onsuccess事件监听器被调用。

最好在之前设置事件处理程序indexedDB.open

于 2013-11-02T11:07:32.483 回答