使用BreezeJS和localStorage进行标签对标签通信

Tab-to-tab communication using BreezeJS and localStorage

本文关键字:标签 通信 BreezeJS localStorage 使用      更新时间:2023-09-26

我正在使用BreezeJS并在本地存储中存储/恢复数据。这很有效。当用户打开多个选项卡时,就会出现问题。每个选项卡中的更改都会相互碰撞。更改应在选项卡之间同步。

注意:BreezeJS将负责合并更改,我只需要处理选项卡之间的竞争条件。

var stashName = 'stash_everything';
window.setInterval(function () {
    var exportData = manager.exportEntities();
    window.localStorage.setItem(stashName, exportData);
}, 5000);
addEvent(window, 'storage', function (event) {
  if (event.key == stashName) {
    var importData = window.localStorage.getItem(stashName);
    manager.importEntities(importData);
  }
});

我试过听"存储"事件,但一直未能成功运行。我要么仍在不断地更改,要么陷入无限循环。

问题的关键在于,我只是在节省一个计时器;如果我只在用户交互后保存,那么我会避免(大多数)比赛条件。不过,据我所知,"自上次我问你以来,用户没有更改任何内容"。

有人对如何处理这个问题有建议吗?

嗯,由于多种原因,这似乎不容易出现问题,但最主要的原因是,您仍然无法阻止来自具有不同数据集的每个选项卡的并发保存。也就是说,如果你对这两个缓存可能不同步这一事实感到满意,只需使用一些唯一的标识符——

加载中的应用程序中的某个位置-

var stashName = 'stash-everything-' + new Date().getTime();
window.setInterval(function () {
    var exportData = manager.exportEntities();
    window.localStorage.setItem(stashName, exportData);
}, 5000);

现在,每个选项卡都有一组唯一的数据可供使用。