HTML5 localStorage是异步的吗?


Answers:


158

不,所有localStorage呼叫都是同步的。


5
我的原始资料来自Mozilla localstorage文档,但从那时起似乎已经对其进行了修订(并且W3规范似乎在任何地方都不需要同步/异步)。在这一点上,我会说localstorage调用是按照约定同步的,而不是按照规范同步的。除非您知道已实现的浏览器是异步的?
瑞安·尼格罗

34
我的问题是我在本地存储中设置了身份验证令牌,然后将用户重定向到另一个视图。有时在新视图访问中,本地存储会发现令牌尚未保存,因此我必须使用超时,但仍不是100%可靠的。
松饼人

@TheMuffinMan:你的问题很可能与nbfexp从身份验证令牌。
Mendes

3
同样对我来说,很奇怪的东西
patotoma

我正面临着同样的问题……这是一种奇怪的行为。
Daniel T. Sobrosa

62

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

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

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

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

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

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

在标准的,喜欢的话mustshall并且may携带非常特定的含义。它在谈论方法必须执行的事实意味着该方法本身必须执行此操作,而不是将其推迟到以后的某个时间。

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


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

本规范不需要上述方法一直等到将数据物理写入磁盘之后。仅要求访问同一键/值对基础列表的不同脚本所看到的内容保持一致。

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


2
实际上,事情不一定会立即刷新到磁盘上,因此,如果关闭然后再次打开页面,则可能没有存储的最新元素。我已经在Android的混合应用程序中对其进行了测试,在某些情况下,它会不适当地使用localStorage。
user276648 2015年

1
我需要将我必须存储的某些对象存储在不同的页面中,最合适的是use LocalStorage。当我存储10件物品时,我想念其中3件。我真的相信它是异步的,但是如何检查它是否完成。我必须在哪里添加回调?
Adi Prasetyo

1
无意中发现了这一点,并认为这是有趣添加到mustshallmay上述RFC2119评论ietf.org/rfc/rfc2119.txt
mistertee

1
我还看到类似异步的行为。当我将一个空对象保存到一个项目时,我注意到在随后立即检索该项目的数据时,会在保存之前返回旧数据。如果我猜到了,那可能只是写入磁盘的延迟
sookie

@sookie操作系统应隐藏任何类似的硬件问题。应用程序从操作系统的缓冲区高速缓存读取,而不是直接从磁盘读取。
Barmar

-6

这个问题已经回答。对于将来遇到此问题的任何人,javascript本质上都是同步的。事情只是异步的,我们指定这样做。因此,您可以假定所有事物都是同步的,除非将它们指定为异步的。这是使用javascript而不是用Javascript编写的框架。他们有时会破坏这种做法。像NodeJs。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.