HTML LocalStorage 中的数据在其他 windows/tabs 中可用所需的时间
Time it takes for data in HTML LocalStorage to be available in other windows/tabs
我有一个使用 HTML LocalStorage 的网页。同时打开此页面的多个 tabs/windows 是很常见的。由于这些都使用相同的 LocalStorage 并且 LocalStorage 不提供事务或类似功能,我想实现某种形式的互斥以防止不同的 tabs/windows 以不受控制的方式覆盖彼此的数据。
我试图通过简单地将 boolean[] F
存储在 LocalStorage 中来将 移植到浏览器。
在 FireFox 中一切正常,但是 Chrome 允许平均大约 1.3 个进程(大多数只有一个,有时是两个,很少甚至是 3 个或更多)同时进入临界区,并且 Internet explorer 平均允许 2 个进程(主要是 1、2 或 3,有时甚至更多)。
由于 algorithm has been proven correct 和我的实现非常简单,而且我已经对它进行了测试,所以我能想出为什么会发生这种情况的唯一原因是 Chrome 和 IE 在我在一个 tab/window 中写入 LocalStorage 和新值在所有其他 tabs/windows.
中可见之间存在延迟
这可能吗?如果是这样,是否有任何文件或对这些延误有任何保证?或者,更好的是,是否有某种 "commit"- 或 "flush()"- 调用可用于强制更改立即传播?
更新:
我整理了一些 jsfiddle 来测试往返时间:
// Get ID
var myID;
id = window.localStorage.getItem("id");
if (id==1) { myID = 1; window.localStorage.setItem("id", 0); }
else { myID = 0; window.localStorage.setItem("id", 1); }
// Initialize statistics variables
var lastrun = (new Date()).getTime();
var totaldelay = 0;
var count = 0;
var checks = 0;
document.documentElement.innerHTML = "ID: "+myID;
// Method that checks the round-trip time
function check() {
window.setTimeout(check, 1); // Keep running
value = window.localStorage.getItem("state");
checks++;
if (value==myID) return;
window.localStorage.setItem("state", myID);
now = new Date().getTime();
totaldelay += now - lastrun;
count++;
lastrun = now;
document.documentElement.innerHTML = "ID: "+myID+"<br/>"+
"Number of checks: "+checks+"<br/>"+
"Number of round-trips: "+count+"<br/>"+
"Checks per round-trip: "+checks/count+"<br/>"+
"Average round-trip time:"+totaldelay/count;
}
// Go!
window.setTimeout(check, 1000);
如果我 运行 这个 fiddle 在两个不同的 windows 中,我在第二个 window 打开时得到以下数字:
Browser | Checks per round-trip | Average round-trip time
------------------+-----------------------+-------------------------
Firefox 24.3.0 | 1.00 | 6.1 ms
Chrome 46.0.2490 | 1.06 | 5.5 ms
IE 10 | 17.10 | 60.2 ms
事实证明 Internet Explorer 再次赢得有史以来最糟糕软件的竞争...
IE11 中实际上存在一个严重的错误(我也看到了 IE10 的问题),如果用户打开多个选项卡,基本上无法可靠地使用 LocalStorage:每个选项卡基本上都有自己的缓存版本相同的存储位置以及该缓存和实际存储之间的同步充其量是不稳定的(如果它发生的话)。一个人根本不能依赖将数据传给另一个人 tab/window,基本上永远不会。
这是官方错误报告:IE 11 - Local Storage - Synchronization issues
(当然,这只是 huge list of other issues with LocalStorage support in IE 之一)
我喜欢这个问题是如何在 2013 年打开甚至得到承认的,但仍然没有得到解决...
不幸的是,发布的三个解决方法中的 none 让我的测试变得更好。
换句话说:在IE10/11.
中基本不可能使用LocalStorage进行跨tab/window通信
令人惊讶的是,windows/tabs 之间的 cookie 同步似乎更加稳定(至少在我对 IE10 的测试中)。所以也许这可以用作解决方法。
我有一个使用 HTML LocalStorage 的网页。同时打开此页面的多个 tabs/windows 是很常见的。由于这些都使用相同的 LocalStorage 并且 LocalStorage 不提供事务或类似功能,我想实现某种形式的互斥以防止不同的 tabs/windows 以不受控制的方式覆盖彼此的数据。
我试图通过简单地将 boolean[] F
存储在 LocalStorage 中来将
在 FireFox 中一切正常,但是 Chrome 允许平均大约 1.3 个进程(大多数只有一个,有时是两个,很少甚至是 3 个或更多)同时进入临界区,并且 Internet explorer 平均允许 2 个进程(主要是 1、2 或 3,有时甚至更多)。
由于 algorithm has been proven correct 和我的实现非常简单,而且我已经对它进行了测试,所以我能想出为什么会发生这种情况的唯一原因是 Chrome 和 IE 在我在一个 tab/window 中写入 LocalStorage 和新值在所有其他 tabs/windows.
中可见之间存在延迟这可能吗?如果是这样,是否有任何文件或对这些延误有任何保证?或者,更好的是,是否有某种 "commit"- 或 "flush()"- 调用可用于强制更改立即传播?
更新:
我整理了一些 jsfiddle 来测试往返时间:
// Get ID
var myID;
id = window.localStorage.getItem("id");
if (id==1) { myID = 1; window.localStorage.setItem("id", 0); }
else { myID = 0; window.localStorage.setItem("id", 1); }
// Initialize statistics variables
var lastrun = (new Date()).getTime();
var totaldelay = 0;
var count = 0;
var checks = 0;
document.documentElement.innerHTML = "ID: "+myID;
// Method that checks the round-trip time
function check() {
window.setTimeout(check, 1); // Keep running
value = window.localStorage.getItem("state");
checks++;
if (value==myID) return;
window.localStorage.setItem("state", myID);
now = new Date().getTime();
totaldelay += now - lastrun;
count++;
lastrun = now;
document.documentElement.innerHTML = "ID: "+myID+"<br/>"+
"Number of checks: "+checks+"<br/>"+
"Number of round-trips: "+count+"<br/>"+
"Checks per round-trip: "+checks/count+"<br/>"+
"Average round-trip time:"+totaldelay/count;
}
// Go!
window.setTimeout(check, 1000);
如果我 运行 这个 fiddle 在两个不同的 windows 中,我在第二个 window 打开时得到以下数字:
Browser | Checks per round-trip | Average round-trip time
------------------+-----------------------+-------------------------
Firefox 24.3.0 | 1.00 | 6.1 ms
Chrome 46.0.2490 | 1.06 | 5.5 ms
IE 10 | 17.10 | 60.2 ms
事实证明 Internet Explorer 再次赢得有史以来最糟糕软件的竞争...
IE11 中实际上存在一个严重的错误(我也看到了 IE10 的问题),如果用户打开多个选项卡,基本上无法可靠地使用 LocalStorage:每个选项卡基本上都有自己的缓存版本相同的存储位置以及该缓存和实际存储之间的同步充其量是不稳定的(如果它发生的话)。一个人根本不能依赖将数据传给另一个人 tab/window,基本上永远不会。
这是官方错误报告:IE 11 - Local Storage - Synchronization issues
(当然,这只是 huge list of other issues with LocalStorage support in IE 之一)
我喜欢这个问题是如何在 2013 年打开甚至得到承认的,但仍然没有得到解决...
不幸的是,发布的三个解决方法中的 none 让我的测试变得更好。
换句话说:在IE10/11.
中基本不可能使用LocalStorage进行跨tab/window通信令人惊讶的是,windows/tabs 之间的 cookie 同步似乎更加稳定(至少在我对 IE10 的测试中)。所以也许这可以用作解决方法。