Est-ce que HTML5 localStorage est asynchrone?

129

La setItem(key,value)fonction est-elle asynchrone?

localStorage.setItem("key",someText);
jas7
la source
1
Je ne devrais pas le penser. Downvoter: quelle est votre justification?
Waleed Khan

Réponses:

157

Non, tous les localStorageappels sont synchrones.

Ryan Nigro
la source
5
Ma source originale était la documentation de Mozilla localstorage, mais il semble qu'ils aient été révisés depuis (et la spécification W3 ne semble pas nécessiter de synchronisation / asynchrone nulle part). À ce stade, je dirais que les appels de stockage local sont synchrones par convention mais pas par spécification. À moins que vous ne connaissiez un navigateur qui l'a implémenté de manière asynchrone?
Ryan Nigro
36
mon problème est que j'ai défini un jeton d'authentification dans le stockage local, puis que je redirige l'utilisateur vers une autre vue. Parfois, sur la nouvelle vue, le stockage local d'accès trouve que le jeton n'a pas encore été enregistré, je dois donc utiliser un délai d'expiration, mais toujours pas fiable à 100%.
The Muffin Man
@TheMuffinMan: Votre problème est probablement lié au jeton d'authentification nbfou à exppartir de celui-ci.
Mendes
3
Idem pour moi, trucs bizarres
patotoma
Je suis confronté au même problème ... c'est un comportement étrange.
Daniel T. Sobrosa
62

Réellement. le stockage Web ne fait plus partie du standard de base HTML5, il a été séparé.

La spécification (brouillon) pertinente peut être trouvée ici et la seule chose que vous remarquerez est qu'elle ne mentionne nulle part synchrone ou asynchrone.

Cependant, l'analyse du texte suggère qu'il doit être synchrone (mon gras):

La méthode setItem (key, value) doit d'abord vérifier si une paire clé / valeur avec la clé donnée existe déjà dans la liste associée à l'objet.

Si ce n'est pas le cas, une nouvelle paire clé / valeur doit être ajoutée à la liste, avec la clé donnée et avec sa valeur définie sur value.

Si la clé donnée existe dans la liste et que sa valeur n'est pas égale à value, alors sa valeur doit être mise à jour à value. Si sa valeur précédente est égale à value, la méthode ne doit rien faire.

Dans les normes, des mots comme must, shallet mayporter très significations spécifiques. Le fait qu'il parle de ce que la méthode doit faire signifie que la méthode elle-même doit le faire, et non la reporter à une date ultérieure.

Cela renvoie également au bon sens. Si le setItemétait asynchrone, il serait possible de définir un élément sur une valeur spécifique puis de le récupérer immédiatement, en obtenant sa valeur précédente.


y a une note au bas de la section de l'interface de stockage qui fait allusion à la possibilité d'un comportement asynchrone:

Cette spécification n'exige pas que les méthodes ci-dessus attendent jusqu'à ce que les données aient été physiquement écrites sur le disque. Seule la cohérence dans ce que voient les différents scripts accédant à la même liste sous-jacente de paires clé / valeur est requise.

Cependant, ce n'est qu'en termes de ce qui est écrit sur le stockage à long terme. La dernière phrase stipule que les scripts accédant au même objet de stockage sont nécessaires pour voir les choses de manière synchrone.

paxdiablo
la source
2
En effet, les choses ne sont pas forcément vidées sur le disque à la fois, donc si vous fermez puis rouvrez votre page, vous risquez de ne pas avoir les derniers éléments que vous avez stockés. J'ai testé cela dans une application hybride sous Android, et cela rend l'utilisation de localStorage inapropriée dans certains cas.
user276648
1
J'ai besoin de stocker un objet que je dois dans une page différente, le plus approprié est l'utilisation LocalStorage. Lorsque je stocke 10 articles, 3 d'entre eux me manquent. Je crois vraiment que c'est asynchrone, mais comment vérifier si c'est fait. où dois-je ajouter un rappel?
Adi Prasetyo le
1
Nous sommes tombés sur ce sujet et pensait que c'était intéressant d'ajouter à la must, shall, maycommentaire ci - dessus 2119 ietf.org/rfc/rfc2119.txt~~V~~singular~~3rd
mistertee
1
Je constate également un comportement de type asynchrone. Lorsque j'enregistre un objet vide dans un élément, je remarque que lors de la récupération des données de l'élément immédiatement après, les anciennes données sont renvoyées avant l'enregistrement. Si je devais deviner, c'est probablement juste le retard d'écriture sur le disque
sookie
@sookie Le système d'exploitation devrait cacher tout problème matériel comme celui-là. Les applications lisent à partir du cache de la mémoire tampon du système d'exploitation, pas directement à partir du disque.
Barmar
-6

Cette question a déjà reçu une réponse. Pour tous ceux qui en viennent à l'avenir, javascript est synchrone par nature. Les choses ne sont asynchrones que si elles sont spécifiées pour le faire. Pour cette raison, vous pouvez supposer que toutes les choses sont synchrones à moins qu'elles ne soient spécifiées comme étant asynchrones. C'est avec javascript, pas avec des frameworks écrits en Javascript. Ils rompent parfois cette pratique. Comme NodeJs.

Scott
la source