- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
它们展示了创建请求,然后在发出请求后附加 onerror
和 onsuccess
处理程序。
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/
是否可以从浏览器外部或创建它的域外部访问 IndexedDB? 我正在考虑将数据存储到与某个特定域相关的某些 IndexedDB 的情况,因为它总是这种情况,然后在第一个域不复存在后访问该数据,或将其
我有一个员工在断开连接模式下使用的渐进式网络应用程序。他们扫描商店中的库存商品,该应用程序搜索本地数据以查找扫描的商品(indexedDb 数据存储,约有 1/2 百万条记录)。 此数据通过 API
有人可以告诉我是否可以使用 index、openCursor 和 keyRange 在 indexeddb 对象存储上执行不区分大小写的搜索.... 我可以区分大小写并设法使用 toUpperCase
来自提供的示例here和 here 它们展示了创建请求,然后在发出请求后附加 onerror 和 onsuccess 处理程序。 var transaction = db.transaction(["
假设您正在构建一个框架 Foobar,并假设 Foobar 有一个函数 .coolstuff(),它会调用 IndexedDB 调用 .coolstuff2() 和 .coolstuff3(),当这两
只要您使用适当的 IDBTransaction,是否可以从单个事务中完成所有这些操作,而不是打开多个事务(读取表、写入表、写入另一个表等)? Mozilla 说:“保持事务处于事件状态的唯一方法是对其
我有一个小项目,将数据存储在浏览器的 IndexedDB 中。我想添加同步功能,以便用户可以在任何地方访问数据。 如何在远程服务器或服务器数据库中同步本地 IndexedDB 数据,以便我可以在任何地
我想在 onupgradeneeded 中更新我的 indexeddb 数据库的对象库之一。我想检查一下,如果这个索引存在于这个对象存储中,那么就不需要做任何更改。但如果不是,我想更新它的索引。 最佳
有没有办法检查 IndexedDB 数据库是否已经存在?当程序试图打开一个不存在的数据库时,该数据库被创建。 我能想到的唯一方法是如下所示,我测试 objectStore 是否已经存在,如果不存在,则
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我的代码如下: ... var f1 = function(trans) { var store = trans.objectStore('ObjectStore'); store.clear
我在我的一页中创建了一个 IndexdDB 对象存储(让对象存储名称为“ShopStore”)。现在我想从不同的页面打开相同的对象存储。可能吗? 我的两个网页位于不同的域。 最佳答案 根据MDN您无法
我有一个 Epub 注释插件,用户可以在其中对 Epub 进行注释,但是注释文本存储在浏览器中的 indexeddb 数据库中,想将这些注释文本导出到文件中,而在其他系统中,我想将这些文件导入到我的
在之前的 IndexedDB 规范 ( http://www.w3.org/TR/2011/WD-IndexedDB-20111206 ) 中,IDBDatabase 事务的模式值很短。在当前规范(2
有没有办法对 IndexedDB 中的同一属性进行 OR 或 IN 查询? 换句话说,我如何得到结果, SELECT * FROM MyTable WHERE columnA IN ('ABC','D
据我了解,IndexedDB 是大多数跨浏览器在线数据库解决方案的方式。甚至可能在 FF 等浏览器中使用这个 polyfill。 我试图找到一个非常简单的页面,它使用 IndexedDB 最初填充数据
给定一个带有一个声明对象存储的 indexeddb 数据库: var objectStore = thisDb.createObjectStore("table", {keyPath: "id", a
我正在构建一个利用 IndexedBD 的网络应用程序。我来自 SQL 背景,所以概念不同。具体来说,我的理解是 indexedDB 中没有“外键”的真正概念。因此,我试图找出检索相关对象的最快方法,
我在不做任何其他修改的情况下升级版本时遇到此代码问题,我无法理解原因。 function create_registry() { var version = 1; var indexe
我使用下面的代码从 indexeddb 中选择所有列 this._connection.openDb(this._indexedDBLiveDBName); return this._
我是一名优秀的程序员,十分优秀!