IndexedDB 如何防止不同窗口间数据重复?

piztneat  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(2)|浏览(262)

我正在开发一个与websocket通信的Angular 应用程序,以传输和接收真实的更新。
在我的应用程序中,用户可以打开多个刚刚从主窗口打开的窗口(新打开的窗口只是用于显示有关主页面中某些数据的详细信息)
每个打开的窗口都需要接收来自websocket到主窗口的相同真实的更新,有时打开的窗口数量可能超过10个。
问题是,如果我在每个新窗口中打开一个新的WebSocket,然后开始列出该窗口中的变化,是否会花费大量的网络资源?我的意思是,现在客户端将遭受互联网损失,如果他打开了很多新窗口。
我的团队提出的一个解决方案是从主页打开一个WebSocket连接,然后使用Indexeddb来存储更改,现在在所有打开的窗口中将听取这些更改,所以我尝试了该解决方案,但现在我在尝试访问Indexeddb时面临一些锁定问题。
因此,问题是打开许多新的websockets连接是否会导致网络丢失?是否有其他方法可以在不同的选项卡之间共享实时数据?

5lwkijsr

5lwkijsr1#

我正在处理真实的更新,在第一页我开始连接,当在第一页收到更改时,我想与新打开的窗口共享它们
处理实时数据时,最好使用MessageQueue机制(如RabbitMQ)。这样你的应用就可以监听并知道对象何时被修改=〉然后更新。你还应该有一个数据库和一个与数据库通信的后端应用。如果你知道python,你可以试试Flask
localStorage应该用来包含一个字符串,其作用类似于配置变量,而不是一个将被快速修改的整个对象。

p8h8hvxi

p8h8hvxi2#

有多种解决方案,但在您的情况下

**第一个解决方案:**我建议您在打开窗口之前将对象存储在数据库中,并添加所有查询参数以在新窗口中获取此数据:

例如:
www.origin.com =〉使用put/patch保存对象
=〉打开一个新窗口= www.origin-popup.com?userId=xxxxx&articleId=xxx
然后,在新的angular应用程序中,您可以使用带有用户ID和文章ID的get来检索数据

第二个解决方案:

您可以合并ngrx和ngrx-store-localstorage来使用一个存储并将其放到本地存储(对于100个对象,将建议您使用第一种解决方案)

第三种解决方案

它仍然是相同的Angular 应用程序,因此您可以处理状态管理和NGRX,然后在第二个窗口中订阅状态更改,当您在第一个窗口中更新状态时,它将触发第二个窗口的更改:ngrx.io/guide/store

相关问题