我对JavaScript函数有疑问。
例如,请参阅以下代码。
我假设'open'函数触发'success'事件函数。但是这怎么可行,因为“成功”功能附加到openRequest 之后调用'open'函数?
var indexedDB = window.indexedDB;
var openRequest = indexedDB.open('MyTestDB');
openRequest.onsuccess = function (response) {
alert('sucess');
};
答案 0 :(得分:5)
对indexDB.open
的调用是异步的。它立即返回,其余代码继续运行。实际打开db时会触发事件。此事件放在事件队列中。 JavaScript解释器定期检查事件队列。但是解释器也是单线程的。它不会跳出正在执行的当前代码来检查它。 onsuccess函数在定义之前永远不会被调用。事实上,DB本身永远不会被打开。
例如,如果在代码末尾添加无限循环,则永远不会运行onsucess函数。
var indexedDB = window.indexedDB;
var openRequest = indexedDB.open('MyTestDB');
openRequest.onsuccess = function (response) {
alert('sucess');
};
while (true) {};
此时执行将被阻止,解释器永远不会检查事件队列,也不会运行on success success函数。
答案 1 :(得分:2)
这是可能的,因为JavaScript VM(例如,以V8为例)比打开indexDB更快地执行成功处理程序的分配。这是因为对indexedDB.open()
的调用是异步的,因此VM在后台中打开数据库,执行事件处理程序分配。
如果延迟事件处理程序的分配,您将看到它不再被调用:
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's answer!
答案 2 :(得分:0)
indexedDB.open
在后台发出异步请求。准备好后,将调用onsuccess
事件侦听器。
在indexedDB.open
之前设置事件处理程序是一种更好的做法。