gpt4 book ai didi

indexeddb - IndexedDB 请求或事务在此时发送

转载 作者:行者123 更新时间:2023-12-02 01:59:51 25 4
gpt4 key购买 nike

来自提供的示例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是设置,通过它在请求的创建中声明所有处理程序。

最佳答案

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

经典训练表明,在以下代码中,第二个语句出现在第一个语句之后,稍后:

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

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

但是,从并发的角度来看,它们是同时发生的。事件循环的特定 channel 中多个语句的同时出现可以称为纪元、时间段或类似的名称。这本质上也可以理解为同步代码。

异步代码的工作方式完全不同。本质上,当您发起对异步函数的调用时,您不会等到该函数返回。同一时期(如上所述)内的其余代码(后面的语句)也会被执行。函数调用最终将完成,但这只会发生在稍后的时期(事件循环的下一次传递,或此后的某个传递)。

让我们大致了解一下异步工作的方式:

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

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

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

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

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

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

这是事物的简化,而且是非正式的,我相信专家想要更准确的解释,但我希望这有助于让您理解顺序并不重要。

关于indexeddb - IndexedDB 请求或事务在此时发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35338471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com