【问题标题】:Is order of storing values to localStorage synchronous?将值存储到 localStorage 的顺序是否同步?
【发布时间】:2015-01-05 02:28:57
【问题描述】:

对不起我糟糕的英语。

我正在使用 localStorage 来存储一些属性。每个属性都有自己的键和值,键和值是动态生成的。所以我不知道他们中有多少人。

在 page1 上保存所有属性(一键)。

在第 2 页我称之为“存储”事件。我需要读取所有键和值并使用这些重新呈现页面内容。

问题是每个键/值对都会触发“存储”事件。而且我不想为每个键/值对重新渲染 page2 的内容。我想等到所有属性都保存在 page1 上,然后重新渲染 page2 的内容。

所以我需要确保所有属性都保存在第 1 页,然后我需要在第 2 页阅读它们。

我的问题:localStorage 的存储过程是同步的吗? “同步”对我来说意味着同时只执行一个 setItem 命令,并且所有 setItem 命令都按照我编写的确切顺序执行。 所以我什么时候写:

(loop start)    
localStorage.setItem("bar1", foo1)
localStorage.setItem("bar2", foo2)
...
localStorage.setItem("bar100", foo100)
(loop end)    

我可以确定所有项目都保存在之前(“bar100”,foo100)吗?

或者可能有任何问题并且 ("bar100", foo100) 可能会在任何前一个项目之前保存?

亚历克斯

【问题讨论】:

  • 是的。 JavaScript 本身是单线程语言。程序从 1 行、2 行等开始执行。
  • 如果没有回调,一般是同步的,localStorage方法是同步的,所以可以确定代码是按顺序执行的,问题是,为什么要按什么顺序被写进去。我怀疑你期望在 localStorage 对象中的键中排序,而 那个 你不会有,因为对象中没有顺序.
  • 如果你想把一堆东西按顺序序列化,然后把它们都放在一个数组中,在数组上调用 JSON.stringify 并保存它。 localStorage 项目没有先天顺序。
  • 根据@jfriend00 的建议,获取或保存一个对象比编写一大堆单独的项目要少得多

标签: javascript local-storage


【解决方案1】:

来自 W3C 规范:

每当要检查、返回、设置或删除 localStorage 属性的 Storage 对象的属性时,无论是作为直接属性访问的一部分,在检查属性是否存在时,在属性枚举期间,在确定数量时存在的属性,或者作为存储接口上定义的任何方法或属性的执行的一部分,用户代理必须首先获取存储互斥体。

这意味着它以同步方式运行,但是,这并不能保证页面重新加载后存储项目的顺序。

但要回答您的问题,是的,"bar100" 将最后写入本地存储。

【讨论】:

  • 感谢您的解释。这很有帮助。我不关心页面重新加载后存储项目的顺序,我唯一需要的是浏览器选项卡/窗口之间的正确同步。所以我将使用最后存储的项目作为指示“所有以前的项目都已保存,page2 可以执行代码”。
猜你喜欢
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 2011-12-10
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
相关资源
最近更新 更多