在研究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()调用之前设置,但我在几个示例中看到了这种模式。有人能帮助我理解这一点吗?
3条答案
按热度按时间btxsgosb1#
这是JavaScript的单线程和异步特性造成的。当你调用open时,函数会立即执行。但是onsuccess回调会放在单线程的函数栈上。这些函数在实际函数结束之前不能被调用。所以你可以改变函数中的request对象,当调用onsuccess时回调就在那里。This是了解执行上下文堆栈的好文章。
33qvvth12#
看起来打开数据库只是一个open,它不是一个实际的DB请求,onsuccess处理程序是用于稍后到来的实际数据库请求的。
在可能调用事件处理程序之前安装它们是一种好的做法,但在这种情况下,
dbOpenRequest
对象直到open调用之后才存在(它是作为open调用的结果返回的),因此在open调用之前无法在其上放置onsuccess
处理程序。onsuccess
处理程序必须在一段时间后作为对open以外的某个事件(可能是DB查询)的响应而被调用,或者根本不被调用。8ljdwjyq3#
这可能是因为打开是异步的,并且有一些延迟(打开不是立即完成的)。JavaScript同时继续执行(并绑定事件)。