【发布时间】:2023-02-04 05:44:59
【问题描述】:
在我的 web 应用程序中,我在 indexeddb 中有项目队列,需要按顺序处理然后从队列中删除,队列当前正在计时器上处理,每个项目可能需要几秒钟的时间来处理。
如何防止多个选项卡同时处理队列?
我考虑过在项目上设置一个状态以指示它正在处理,但在选项卡/窗口中关闭然后项目将卡在该状态并阻止队列。
我如何确保在一个选项卡/窗口上可以一次处理 indexeddb 中的队列?
【问题讨论】:
标签: indexeddb
在我的 web 应用程序中,我在 indexeddb 中有项目队列,需要按顺序处理然后从队列中删除,队列当前正在计时器上处理,每个项目可能需要几秒钟的时间来处理。
如何防止多个选项卡同时处理队列?
我考虑过在项目上设置一个状态以指示它正在处理,但在选项卡/窗口中关闭然后项目将卡在该状态并阻止队列。
我如何确保在一个选项卡/窗口上可以一次处理 indexeddb 中的队列?
【问题讨论】:
标签: indexeddb
如果处理需要几秒钟,这听起来像是涉及 IndexedDB 本身之外的异步工作(例如一些网络请求、UI 更新等)。所以简单地使用 IDB 事务是不可行的。
在这种情况下,请查看 Web Locks API https://developer.mozilla.org/en-US/docs/Web/API/Web_Locks_API,它专为这种交叉表协调而设计,处于比数据库事务更高的级别。每个选项卡都可以在需要工作时尝试抢锁;如果另一个选项卡有锁,则不会执行回调。具有锁的选项卡会一直持有它,直到异步操作完成。
底层操作(数据库、网络等)不会自动与锁定集成,因此您需要设置在正确时间发生的承诺解决方案,例如将 IDB 工作包装在承诺中。但是 Web Locks API 应该有助于整体协调,而且现在所有浏览器都可以使用它。
【讨论】: