Mi fuente original fueron los documentos de almacenamiento local de Mozilla, pero parece que han sido revisados desde entonces (y la especificación W3 no parece requerir sincronización / asíncrono en ningún lado). En este punto, diría que las llamadas de almacenamiento local son sincrónicas por convención pero no por especificación. ¿A menos que conozca un navegador que lo implementó de forma asíncrona?
Ryan Nigro
35
mi problema es que configuro un token de autenticación en el almacenamiento local y luego redirijo al usuario a otra vista. A veces, en la nueva vista, el acceso al almacenamiento local descubre que el token aún no se guardó, por lo que tengo que usar un tiempo de espera, pero aún no es 100% confiable.
The Muffin Man
@TheMuffinMan: Su problema probablemente esté relacionado con nbfo expdesde el token de autenticación.
Mendes
3
Lo mismo para mí, cosas raras
patotoma
Estoy enfrentando el mismo problema ... es un comportamiento extraño.
Daniel T. Sobrosa
62
Realmente. El almacenamiento web ya no es parte del estándar principal de HTML5, se ha dividido.
La especificación relevante (borrador) se puede encontrar aquí y lo único que notará es que no menciona síncrono o asíncrono en ningún lado.
Sin embargo, el análisis del texto sugeriría que debe ser sincrónico (mi negrita):
El método setItem (clave, valor) primero debe verificar si un par clave / valor con la clave dada ya existe en la lista asociada con el objeto.
Si no es así, se debe agregar un nuevo par clave / valor a la lista, con la clave dada y con su valor establecido en valor.
Si la clave dada existe en la lista, y su valor no es igual al valor, entonces debe tener su valor actualizado a valor. Si su valor anterior es igual al valor, entonces el método no debe hacer nada.
En las normas, las palabras como must, shally mayllevan muy significados específicos. El hecho de que esté hablando de lo que debe hacer el método significa que el método en sí debe hacerlo, no diferirlo en algún momento posterior.
Esto también difiere al sentido común también. Si setItemfueran asíncronos, sería posible establecer un elemento en un valor específico y luego recuperarlo inmediatamente, obteniendo su valor anterior.
No es una nota en la parte inferior de la sección de interfaz de almacenamiento, que alude a la posibilidad de un comportamiento asíncrono:
Esta especificación no requiere que los métodos anteriores esperen hasta que los datos se hayan escrito físicamente en el disco. Solo se requiere coherencia en lo que ven los diferentes scripts que acceden a la misma lista subyacente de pares clave / valor.
Sin embargo, eso es solo en términos de lo que está escrito en el almacenamiento a largo plazo. La última oración exige que las secuencias de comandos que acceden al mismo objeto de almacenamiento sean necesarias para ver las cosas sincrónicamente.
De hecho, las cosas no se tiran necesariamente al disco de inmediato, por lo que si cierra y vuelve a abrir su página, es posible que no tenga los últimos elementos que almacenó. Lo probé en una aplicación híbrida en Android, y hace que el uso de localStorage sea inapropiado en algunos casos.
usuario276648
1
Necesito almacenar algún objeto que tengo que tener en una página diferente, el más apropiado es el uso LocalStorage. Cuando almaceno 10 artículos, extraño 3 de ellos. Realmente creo que es asíncrono, pero cómo verificar si lo hizo. ¿Dónde tengo que agregar la devolución de llamada?
También estoy viendo un comportamiento asíncrono. Cuando guardo un objeto vacío en un elemento, noto que al recuperar los datos del elemento inmediatamente después, devuelve los datos anteriores antes de guardarlos. Si tuviera que adivinar, probablemente sea solo la demora de escribir en el disco
sookie
@sookie El sistema operativo debería ocultar cualquier problema de hardware como ese. Las aplicaciones leen de la memoria caché del búfer del sistema operativo, no directamente del disco.
Barmar
-6
Esta pregunta ya ha sido respondida. Para cualquiera que llegue a esto en el futuro, JavaScript es sincrónico por naturaleza. Las cosas son solo asíncronas si estamos especificados para hacerlo. Debido a esto, puede asumir que todas las cosas son síncronas a menos que se especifique que son asíncronas. Esto es con javascript, no con frameworks escritos en Javascript. A veces rompen esta práctica. Al igual que NodeJs.
Respuestas:
No, todas las
localStorage
llamadas son sincrónicas.fuente
nbf
oexp
desde el token de autenticación.Realmente. El almacenamiento web ya no es parte del estándar principal de HTML5, se ha dividido.
La especificación relevante (borrador) se puede encontrar aquí y lo único que notará es que no menciona síncrono o asíncrono en ningún lado.
Sin embargo, el análisis del texto sugeriría que debe ser sincrónico (mi negrita):
En las normas, las palabras como
must
,shall
ymay
llevan muy significados específicos. El hecho de que esté hablando de lo que debe hacer el método significa que el método en sí debe hacerlo, no diferirlo en algún momento posterior.Esto también difiere al sentido común también. Si
setItem
fueran asíncronos, sería posible establecer un elemento en un valor específico y luego recuperarlo inmediatamente, obteniendo su valor anterior.No es una nota en la parte inferior de la sección de interfaz de almacenamiento, que alude a la posibilidad de un comportamiento asíncrono:
Sin embargo, eso es solo en términos de lo que está escrito en el almacenamiento a largo plazo. La última oración exige que las secuencias de comandos que acceden al mismo objeto de almacenamiento sean necesarias para ver las cosas sincrónicamente.
fuente
LocalStorage
. Cuando almaceno 10 artículos, extraño 3 de ellos. Realmente creo que es asíncrono, pero cómo verificar si lo hizo. ¿Dónde tengo que agregar la devolución de llamada?must
,shall
,may
comentario anterior RFC2119 ietf.org/rfc/rfc2119.txt~~V~~singular~~3rdEsta pregunta ya ha sido respondida. Para cualquiera que llegue a esto en el futuro, JavaScript es sincrónico por naturaleza. Las cosas son solo asíncronas si estamos especificados para hacerlo. Debido a esto, puede asumir que todas las cosas son síncronas a menos que se especifique que son asíncronas. Esto es con javascript, no con frameworks escritos en Javascript. A veces rompen esta práctica. Al igual que NodeJs.
fuente