HTML5 localStorage是异步的吗?

jas*_*as7 109 html5

setItem(key,value)函数是异步的吗?

localStorage.setItem("key",someText);
Run Code Online (Sandbox Code Playgroud)

Rya*_*gro 135

不,所有的localStorage电话都是同步的.

  • 我的问题是我在本地存储中设置了一个身份验证令牌,然后将用户重定向到另一个视图.有时在新视图访问本地存储上发现令牌尚未保存,因此我必须使用超时,但仍然不是100%可靠. (21认同)
  • 这些信息的来源是什么? (11认同)
  • 我的原始来源是Mozilla localstorage文档,但看起来它们从那时起就被修改过了(W3规范似乎不需要在任何地方同步/异步).在这一点上,我会说localstorage调用是按惯例同步的,而不是spec.除非你知道一个浏览器实现了异步? (5认同)
  • 我也一样,奇怪的东西 (3认同)
  • 同样的问题,在AngularJS 1.7.2中,我的令牌不使用nbf或exp ... (2认同)
  • 同样,我只是添加了 0 超时,效果很好。 (2认同)

pax*_*blo 58

其实.网络存储不再是HTML5核心标准的一部分,它已被拆分.

相关(草案)规范可以在这里找到,你会注意到的一件事是它没有提到任何地方的同步或异步.

但是,对文本的分析表明它必须是同步的(我的粗体):

setItem(键,值)方法必须首先检查是否有键/值对与给定键与该对象相关联的列表已经存在.

如果没有,则必须将新的键/值对添加到列表中,并使用给定的键并将其值设置为value.

如果给定键确实存在于列表中,并且其值不等于value,则它必须将其值更新为value.如果其先前的值等于value,则该方法必须不执行任何操作.

在标准中,单词喜欢must,shallmay带有非常具体的含义.它正在讨论方法必须做的事实意味着方法本身必须这样做,而不是将它推迟到以后的某个时间.

这也符合常识.如果setItem是异步的,则可以将项目设置为特定值,然后立即检索它,获取其先前的值.


在存储接口部,其暗示的异步行为的可能性的底部的注释:

该规范不要求上述方法等待数据物理写入磁盘.只需要访问相同的键/值对列表中的不同脚本的一致性.

但是,这仅仅是针对长期存储的内容.最后一句要求访问同一存储对象的脚本需要同步查看内容.

  • 事实上,事情不一定会被冲到磁盘上,所以如果你关闭再打开你的页面,你可能没有存储的最新元素.我已经在Android中的混合应用程序中对其进行了测试,并且在某些情况下使得localStorage的使用不合适. (2认同)
  • 我需要存储一些必须在不同页面中的对象,最合适的是使用“LocalStorage”。当我存放 10 件物品时,我错过了其中 3 件。我真的相信它是异步的,但是如何检查它是否完成。我必须在哪里添加回调? (2认同)
  • 我还看到类似异步的行为。当我将空对象保存到项目时,我注意到在随后立即检索项目的数据时会返回保存之前的旧数据。如果我猜的话,这可能只是写入磁盘的延迟 (2认同)