WebWorker可以访问localStorage吗?
如果不是为什么不呢?从安全角度来看,这有问题吗?
我猜这是一个错误,但我还没有找到任何关于此的讨论.
众所周知,IE10将(针对规范)本地存储事件(即,在触发事件的同一全局执行上下文中),但IE11似乎更偏离规范(http://www.w3.org)/TR/webstorage /)当涉及到同域iframe时:
您可以通过在两个单独的选项卡中打开以下链接来测试此问题:http://hansifer.com/main.html
任何人都对这个怪癖有任何见解?
最新测试版本: IE v11.0.9600.16476 (更新2016-08-13:显然它是相关的"更新版本",而不是IE的"关于"对话框中报告的"版本")
链接到错误报告: https ://connect.microsoft.com/IE/feedback/details/811546/ie11-localstorage-events-fire-twice-or-not-at-all-in-iframes
更新2015-10-26
我只是注意到这似乎在v11.0.9600.18059中修复了,虽然我无法分辨修复程序何时删除,因为它似乎没有在任何最近的KB中被引用.
不幸的是,IE11 localStorage事件在其他方面仍然存在异常(尽管这些与本文中提出的问题不同):
IE在窗口上下文中引发localStorage事件,从中调用localStorage设置或删除触发事件的事件.localStorage事件只应在同一来源的外部窗口上下文中引发.(更新:在EdgeHTML 13.10586中工作)
IE使用空字符串,而不是null用于e.oldValue/e.newValue在添加存储物品/移除.(更新:仍然是EdgeHTML 13.10586中的问题)
IE不确定地调用localStorage事件处理程序,或者在设置/删除之前或之后生效,而不是一致地执行AFTER.
更新2015-12-24
看来这个bug被转移到了Edge(测试过的EdgeHTML 13.10586)
更新2016-02-02
韦尔普,没关系.在IE v11.63.10586.0中再次观察到此错误(更新2016-08-13:显然它是相关的"更新版本",而不是IE的"关于"对话框中报告的"版本")
更新2016-08-13
现在似乎已在IE(更新版本11.0.34)中修复了此问题,尽管存储事件仍然在原始窗口中针对规范(如上所述的已知长期问题)触发.
我发现这个KB包含在IE 2016年6月14日的安全更新中,尽管根据其描述它只涉及上面的第二个项目符号.
至于Edge(经测试的EdgeHTML 14.14393),似乎现在已经修复了这个问题,但是存在一个新问题:存储事件不会在同一页面的同源帧中触发.
我在这里分别向MS报告.
虽然我理解JavaScript本质上是单线程的,并且通常对这些事情不满意,但我想知道是否有任何方法可以让WebWorker等到主线程提供一些数据而不破坏WebWorker的调用堆栈.
由于这是一个有趣的项目,我可以使用新技术和不能在旧浏览器上可靠运行的东西,我不介意深奥的黑客,只要它们工作.
我考虑过的其他一些解决方案:
在循环中连续轮询LocalStorage,直到预定密钥上有数据.这似乎是有效的,因为即使在循环中轮询时,其他线程的LocalStorage更新应该对当前线程可见,从所有关于LocalStorage的线程安全性的讨论判断并且有多个选项卡写入相同的LocalStorage键.这种方法的缺点是它不是真正"等待",即工作线程仍然消耗在LocalStorage上的全部CPU使用率.虽然LocalStorage通常使用锁实现,但是长时间不能持有LocalStorage锁(锁被释放一次getItem或setItem返回).
ECMAScript 6 yield.这在这里不起作用,因为它需要调用堆栈中的所有函数(直到你想要屈服的地方)被标记为生成器函数.我想暂停我的WebWorker的地方有一个包含WebAssembly函数的调用堆栈,它不能标记为生成器函数.
IndexedDB的.这不起作用,因为IndexedDB不支持同步请求.
我知道这个类似的问题,但是这个问题专门讨论了这个onmessage事件,并在2012年之前被问到,yield并且引入了WebAssembly.
有没有办法以某种方式模拟WebWorker线程上的锁,否则,它会等到某些数据可用?
javascript ×3
web-worker ×2
events ×1
html5 ×1
iframe ×1
locking ×1
synchronous ×1
webassembly ×1