处理触发两个indexedDB写事件到同一对象存储区的单个用户操作的正确方法是什么?

时间:2019-05-10 03:57:42

标签: javascript indexeddb

我正在使用一个带有选项卡式显示的网页,该页面仅使用display样式属性隐藏除所选选项卡之外的所有选项卡。当选择一个新选项卡时,将调用一个函数,该函数从页面收集一些数据并将其写入到indexedDB对象存储中,以用于恢复选项卡的先前状态,例如所选元素和光标位置,而这些都不是保存每个更改似乎很有效。

同时,重要数据会立即保存,例如在文本区域上发生change事件,该事件会将数据写入与上述相同的对象存储中。

我的问题是,当用户向textarea元素之一写入新文本时,当textarea仍然具有焦点时,单击按钮以导航至选项卡(不是浏览器选项卡,而是仅选项卡式)在网页中显示)?这个单一用户操作会在“相同”时间并在同一对象存储上触发两个数据库写事务。

在测试中,我尝试将大量数据放置在文本区域中,然后再离开该选项卡,以尝试使change写事件花费更多时间来完成;但是,由change事件触发的写事务总是在该事件捕获选项卡的最后状态之前完成。

这样做的原因可能是,除了最后一个滚动位置之外,所有数据均来自少量HTML元素的dataset对象,并且该步骤可能需要更长的时间才能进行交易,甚至打开。

但是,我想对它的编码尽可能接近“防故障”感到更加自信,并且想知道如何防止这两项交易以任何方式阻止或干扰导致交易损失的情况。数据或程序故障。

我真的不知道为代码示例提供什么,因为除了显示一个带有change事件和一组单选按钮(还带有change事件)的单选按钮的textarea元素之外,什么都没有显示,该元素调用一个可以在隐藏一个标签并显示另一个标签之前收集数据并打开写事务。

一切正常,并且一次都没有失败,但是如何确定它呢?

谢谢。

添加在困扰了一段时间之后,我认为我误解了indexedDB中阻塞的概念。我只是假定它与试图同时写入同一对象存储的两个写入事务有关,但是在进一步阅读之后,我认为情况并非如此。如果我正确理解,则此MDN document声明事务以它们在代码中出现的顺序进行处理,该示例是两个写入事务。

因此,对于我的一个change事件在触发另一个写事务的同时“触发”写事务的问题,似乎唯一关心的是一个事务会覆盖由该写事务写入的数据。其他交易。浏览器将处理其余的事务,除了重要的事务顺序外,我不必担心事务会干扰或阻塞。在打开的数据库上,阻止似乎是版本更改问题。

关于我的原始问题,change事件始终在测试中首先完成,因为它的事务自触发以来总是首先打开,我假设在blur上的textarea事件中,发生在单选按钮上的change事件之前,该事件在mouseup上触发第二个写事务。我假设在同一个对象存储库上打开的第二个写事务要等到第一个完成后才开始。但是在参考文档中除了下面没有其他描述级别。

  

执行代码后,对象存储区应包含值“ 2”,因为trans2应该在trans1之后运行。

关键是,即使第一个写入事务相对于第二个事务花费的时间要长得多,第二个事务也要等到第一个事务完成后才能开始,而第二个事务可能会覆盖在第一个事务中写入的数据。

>

有时候我会感到困惑,在没有任何问题的情况下出现问题,并且浏览器的编码人员已经在照顾它。

如果我仍然误会,不胜感激。谢谢。

0 个答案:

没有答案
相关问题