Ist HTML5 localStorage asynchron?

128

Ist die setItem(key,value)Funktion asynchron?

localStorage.setItem("key",someText);
jas7
quelle
1
Ich sollte nicht so denken. Downvoter: Was ist Ihre Begründung?
Waleed Khan
Siehe auch
Megawac

Antworten:

157

Nein, alle localStorageAnrufe sind synchron.

Ryan Nigro
quelle
5
Meine ursprüngliche Quelle waren die Mozilla Localstorage-Dokumente, aber es sieht so aus, als ob sie seitdem überarbeitet wurden (und die W3-Spezifikation scheint nirgendwo Synchronisierung / Asynchronisierung zu erfordern). An dieser Stelle würde ich sagen, dass Localstorage-Aufrufe nach Konvention synchron sind, aber nicht nach Spezifikation. Es sei denn, Sie kennen einen Browser, der asynchron implementiert ist?
Ryan Nigro
34
Mein Problem ist, dass ich ein Authentifizierungstoken im lokalen Speicher festgelegt und den Benutzer dann zu einer anderen Ansicht umgeleitet habe. Manchmal stellt der lokale Speicherzugriff in der neuen Ansicht fest, dass das Token noch nicht gespeichert wurde, sodass ich eine Zeitüberschreitung verwenden muss, aber immer noch nicht 100% zuverlässig.
Der Muffinmann
@TheMuffinMan: Ihr Problem hängt wahrscheinlich mit nbfoder expvom Authentifizierungstoken zusammen.
Mendes
3
Das gleiche gilt für mich, komisches Zeug
Patotom
Ich stehe vor dem gleichen Problem ... es ist ein seltsames Verhalten.
Daniel T. Sobrosa
62

Tatsächlich. Webspeicher ist nicht mehr Teil des HTML5-Kernstandards, sondern wurde abgespalten.

Die relevante (Entwurfs-) Spezifikation finden Sie hier, und Sie werden feststellen, dass nirgendwo synchron oder asynchron erwähnt wird.

Eine Analyse des Textes würde jedoch darauf hindeuten, dass er synchron sein muss (fett gedruckt):

Die setItem (Schlüssel, Wert) Verfahren müssen zunächst überprüfen , ob ein Schlüssel / Wert - Paar mit dem gegebenen Schlüssel existiert bereits in der Liste mit dem Gegenstand verbunden ist .

Ist dies nicht der Fall, muss der Liste ein neues Schlüssel / Wert-Paar hinzugefügt werden, wobei der angegebene Schlüssel und der Wert auf Wert gesetzt sind.

Wenn der angegebene Schlüssel in der Liste vorhanden ist und sein Wert nicht dem Wert entspricht, wird er verwendet muss sein Wert auf den Wert aktualisiert werden. Wenn der vorherige Wert gleich dem Wert ist, darf die Methode nichts tun.

In Normen, Wörter wie must, shallund maytragen sehr spezifische Bedeutungen. Die Tatsache, dass es darum geht, was die Methode tun muss, bedeutet, dass die Methode es selbst tun muss und es nicht auf einen späteren Zeitpunkt verschieben muss.

Dies widerspricht auch dem gesunden Menschenverstand. Wenn die setItemasynchron wären, wäre es möglich, ein Element auf einen bestimmten Wert zu setzen und es dann sofort abzurufen, wobei der vorherige Wert abgerufen wird.


Am Ende des Abschnitts über die Speicherschnittstelle befindet sich ein Hinweis, der auf die Möglichkeit eines asynchronen Verhaltens hinweist:

Diese Spezifikation erfordert nicht, dass die obigen Methoden warten, bis die Daten physisch auf die Festplatte geschrieben wurden. Es ist nur die Konsistenz der verschiedenen Skripte erforderlich, die auf dieselbe zugrunde liegende Liste von Schlüssel / Wert-Paaren zugreifen.

Dies gilt jedoch nur für das, was in die Langzeitspeicherung geschrieben wurde. Der letzte Satz schreibt vor, dass Skripte, die auf dasselbe Speicherobjekt zugreifen, erforderlich sind, um die Dinge synchron zu sehen.

paxdiablo
quelle
2
In der Tat werden die Dinge nicht unbedingt sofort auf die Festplatte geleert. Wenn Sie also Ihre Seite schließen und dann wieder öffnen, sind möglicherweise nicht die neuesten Elemente gespeichert. Ich habe das in einer Hybrid-App in Android getestet und es macht die Verwendung von localStorage in einigen Fällen unangemessen.
Benutzer276648
1
Ich muss ein Objekt speichern, das ich auf einer anderen Seite haben muss. Am besten geeignet ist die Verwendung LocalStorage. Wenn ich 10 Artikel speichere, vermisse ich 3 davon. Ich glaube wirklich, dass es asynchron ist, aber wie man überprüft, ob es getan wird. Wo muss ich einen Rückruf hinzufügen?
Adi Prasetyo
1
Taumelte auf diese und dachte , das war interessant zu dem hinzuzufügen must, shall, mayKommentar über RFC2119 ietf.org/rfc/rfc2119.txt
mistertee
1
Ich sehe auch asynchrones Verhalten. Wenn ich ein leeres Objekt in einem Artikel speichere, stelle ich fest, dass beim Abrufen der Daten des Artikels unmittelbar danach die alten Daten vor dem Speichern zurückgegeben werden. Wenn ich raten sollte, ist es wahrscheinlich nur die Verzögerung des Schreibens auf die Festplatte
Sookie
@sookie Das Betriebssystem sollte solche Hardwareprobleme verbergen. Anwendungen werden aus dem Puffercache des Betriebssystems gelesen, nicht direkt von der Festplatte.
Barmar
-6

Diese Frage wurde bereits beantwortet. Für jeden, der in Zukunft dazu kommt, ist Javascript von Natur aus synchron. Die Dinge sind nur asynchron, wir sind dafür spezifiziert. Aus diesem Grund können Sie davon ausgehen, dass alle Dinge synchron sind, es sei denn, sie sind als asynchron angegeben. Dies geschieht mit Javascript, nicht mit in Javascript geschriebenen Frameworks. Sie brechen manchmal diese Praxis. Wie NodeJs.

Scott
quelle