IndexedDB 请求和事务的时间

Timing of IndexedDB requests and transactions

我正在阅读 IndexedDB(developers.google.com and MDN)。据我所知,几乎任何事情的通常模式是

  1. 创建请求对象,
  2. 添加 onsuccess、onerror 以及更多回调
  3. 没有 3.

请求然后最终完成它的事情并调用我的函数之一(或者如果使用包装器,则实现承诺)。 我缺少某种承诺步骤。鉴于请求的实现是异步的,这是否意味着它可以在不同的线程上发生?如果是这样,如果它真的很快(或者我的代码真的很慢)并且在我设置回调之前设法在 1 和 2 之间终止怎么办?

或者在空闲期间请求将 运行 在同一个线程上?如果是这样,我可以想象我会淹没请求队列(比如在非常低调的设备上)。如果回调不是一个选项(我的函数仍然是 运行ning),将如何发出信号?

诸如 put 或 add 之类的写入请求将要完成的工作附加到创建它的事务上。写入请求在其事务提交时提交。事务在检测到没有更多请求要处理后不久提交。

关于提交的含义有点复杂,因为我认为 Firefox 和 Chrome 有不同的含义,或者在过去的某个时候,Chrome 在内存中提交后来刷新到磁盘,但 Firefox 直到刷新到磁盘才提交,或者它的倒退,抱歉。然而刷新到磁盘可能是 pedantic/arbitray 所以我不会担心这个区别。尤其是在你不熟悉的情况下。

要检测事务何时提交,请侦听事务的完成事件。

要检测事务何时因错误回滚且未提交,请监听事务的错误事件。这里还有一个奇怪的注释,事务没有错误 属性,只有请求有。因此事务级别的错误事件将对应于其中一个请求的错误。

要检测事务何时成功完成或未完成,请侦听完成事件和错误事件。

JavaScript 是单线程的。 indexedDB 为您管理线程等。您无需担心线程。

如果您的代码非常慢,在请求期间终止,交易将无法成功完成。数据库将处于与开始请求之前相同的状态,就好像请求从未发生过一样。

如果您的代码非常慢,在第一个请求完成后但在同一事务中的后续请求完成之前终止,则事务将不会成功完成。只有当所有请求都成功完成时,事务才会成功完成。因此,数据库将处于与开始第一个请求之前相同的状态,就好像事务中的请求发生了 none。

如果 indexedDB 由于某种性能压力错误而无法完成事务,则有问题的事务基本上不会提交,并且不会发生持久状态更改。这将被视为某种更普遍的 JavaScript 错误,或者在性能允许的情况下,只是一个正常的事务错误。