此时发送的是IndexedDB请求或事务

时间:2016-02-11 11:45:09

标签: indexeddb

来自提供的示例herehere

他们会显示创建请求,然后在请求完成后附加onerroronsuccess处理程序。

var transaction = db.transaction(["customers"], "readwrite");

// Do something when all the data is added to the database.
transaction.oncomplete = function(event) {
    alert("All done!");
};

transaction.onerror = function(event) {
    // Don't forget to handle errors!
};

var objectStore = transaction.objectStore("customers");
    for (var i in customerData) {
        var request = objectStore.add(customerData[i]);
       request.onsuccess = function(event) {
           // event.target.result == customerData[i].ssn;
       };
}

所以我的问题是,请求发送到哪一点。 可能是因为如果请求足够快,处理程序就不会被附加,因此不会触发。

我很惊讶他们没有写出如何设置JQuery get request,在创建请求时声明所有处理程序。

2 个答案:

答案 0 :(得分:3)

如果我理解了您的问题,那么为了让您开始理解答案,您需要了解或查看异步javascript。如果你已经知道这些东西,抱歉,但在我看来,如果你知道这一点,你会很容易回答你自己的问题。

经典训练说,在下面的代码中,第二个语句出现在第一个语句之后,稍后:

var x = 1;
var y = 2;
console.log('%s %s', x, y);

然而,这实际上是对实际情况的简化。本质上,Javascript引擎中有一个隐藏的进程,称为事件循环。循环中的每次迭代都会执行一系列语句。这些语句按顺序(按顺序)执行,技术上稍有不同。

但是,从并发的角度来看,它们发生在相同的时间。事件循环的特定传递中的几个语句的这种共现可以被称为时期,或时间段,或者那种效果。这也可以基本上理解为同步代码。

异步代码的工作方式完全不同。实质上,当您启动对异步函数的调用时,您不会等到该函数返回。还执行在同一时期(如上所述)内的其余代码(后面的语句)。函数调用最终会完成,但这只会发生在以后的纪元中(事件循环的下一次传递,或之后的一些传递)。

让我们看看事物是如何异步工作的:

var x, y;
setTimeout(function eventuallyRunMe() {
 x = 1;
 y = 2;
}, 1);
console.log('%s %s', x, y);

在第一个时期,变量被声明,它们没有赋值,并且执行了对setTimeout的调用。 然后,纪元完成,下一个纪元开始。 JS引擎检查是否已经过了1秒。我们假设它确实如此。 然后,JS引擎从头到尾调用finallyRunMe。该函数将值分配给外部范围中的x和y。然后,对于第二个时期的剩余时间,以及所有未来的时期,x和y都有值。

因此,如果您要运行此代码,那么在同步示例中,您将看到打印到控制台的x和y值。在异步示例中,您将看到undefined。这是因为对console.log的调用发生在与同步示例中的声明和赋值相同的时期,但不在与同步示例中的赋值相同的时期。

现在,查看示例中的代码:

var transaction = db.transaction(...);
transaction.oncomplete = function() {};
transaction.onerror = function() {};

正如您所注意到的,无论这些语句的顺序如何,代码都能正常工作。那是正确的。这些陈述是关联的。订单并不重要。这是因为这些语句只是异步回调的同步注册。对db.transaction的调用实际上并不会立即在同一时期打开交易。它会立即创建一个引用事务的变量,它会立即创建一个事务对象,但它不一定会开始运行事务的put / get / openCursor请求。什么都没发生。只有在这个时代的最后,才能开始发生任何事情。在纪元的末尾(或者下一个的开始,无论你认为哪个更容易理解),底层的JS引擎会返回并查看要执行的注册内容,然后几乎一次执行所有内容。然后JS事件循环的下一个纪元开始,如果那时调用已经完成,则调用回调函数,等等。

这是对事物的简化和非正式的,我确信专家是想要更准确的解释,但我希望这有助于让您了解订单的重要性。

答案 1 :(得分:2)

  

可能是因为如果请求足够快,处理程序就不会被附加,因此不会触发

不,你不必担心。该事件排队等待,并且只有在下次控制返回脚本时才触发,此时您的处理程序将被分配。