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

时间:2012-02-05 21:28:26

标签: javascript javascript-events indexeddb

在查看IndexedDB API时,我发现在方法调用之后设置事件处理程序的几个示例看起来应该触发事件。 For example

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

看来打开数据库只是一个开放的。它不是一个实际的DB请求,而onsuccess处理程序是针对稍后出现的实际数据库请求。

最好在可能被调用之前安装事件处理程序,但在这种情况下,dbOpenRequest对象在打开调用之后才会存在(它作为打开调用的结果返回)所以在打开之前无法在其上放置onsuccess处理程序。因此,onsuccess处理程序必须在稍后调用,作为对open(可能是DB查询)之外的某些事件的响应,或者根本不调用。

答案 2 :(得分:0)

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