LocalStorage HTML5 è asincrono?


Risposte:


157

No, tutte le localStoragechiamate sono sincrone.


5
La mia fonte originale erano i documenti di localstorage di Mozilla, ma sembra che siano stati rivisti da allora (e le specifiche W3 non sembrano richiedere sincronizzazione / asincrono da nessuna parte). A questo punto, direi che le chiamate localstorage sono sincrone per convenzione ma non per specifica. A meno che tu non sia a conoscenza di un browser che lo ha implementato in modo asincrono?
Ryan Nigro

36
il mio problema è che ho impostato un token di autenticazione nella memoria locale e quindi reindirizzato l'utente a un'altra vista. A volte nella nuova visualizzazione l'accesso all'archiviazione locale rileva che il token non è stato ancora salvato, quindi devo usare un timeout, ma non è ancora affidabile al 100%.
The Muffin Man

@TheMuffinMan: Il tuo problema è probabilmente correlato nbfao expdal token di autenticazione.
Mendes

3
Lo stesso per me, cose strane
patotoma

Sto affrontando lo stesso problema ... è un comportamento strano.
Daniel T. Sobrosa

62

In realtà. l'archiviazione web non fa più parte dello standard di base HTML5, è stata suddivisa.

La specifica (bozza) pertinente può essere trovata qui e l'unica cosa che noterai è che non menziona sincrono o asincrono da nessuna parte.

Tuttavia, l'analisi del testo suggerirebbe che deve essere sincrono (il mio grassetto):

Il metodo setItem (key, value) deve prima controllare se una coppia chiave / valore con la chiave specificata esiste già nell'elenco associato all'oggetto.

In caso contrario, è necessario aggiungere una nuova coppia chiave / valore all'elenco, con la chiave specificata e con il valore impostato su value.

Se la chiave specificata esiste nell'elenco e il suo valore non è uguale a value, il suo valore deve essere aggiornato a value. Se il valore precedente è uguale a value, il metodo non deve fare nulla.

In standard, parole come must, shalle mayportano molto significati specifici. Il fatto che si parli di ciò che il metodo deve fare significa che il metodo stesso deve farlo, non rimandarlo a un momento successivo.

Anche questo rimanda al buon senso. Se setItemfosse asincrono, sarebbe possibile impostare un elemento su un valore specifico quindi recuperarlo immediatamente, ottenendo il valore precedente.


C'è una nota alla fine della sezione interfaccia di memoria che accenna alla possibilità di comportamento asincrono:

Questa specifica non richiede che i metodi di cui sopra attendono fino a quando i dati non sono stati scritti fisicamente su disco. È richiesta solo la coerenza in ciò che diversi script che accedono allo stesso elenco sottostante di coppie chiave / valore vedono.

Tuttavia, questo è solo in termini di ciò che viene scritto nell'archiviazione a lungo termine. L'ultima frase impone che gli script che accedono allo stesso oggetto di archiviazione siano necessari per vedere le cose in modo sincrono.


2
In effetti le cose non vengono necessariamente scaricate su disco in una volta, quindi se chiudi e poi riapri la tua pagina, potresti non avere gli ultimi elementi che hai memorizzato. L'ho testato in un'app ibrida su Android e in alcuni casi l'utilizzo di localStorage non è appropriato.
user276648

1
ho bisogno di memorizzare un oggetto che devo in una pagina diversa, il più appropriato è l'uso LocalStorage. Quando immagazzino 10 articoli, ne manco 3. Credo davvero che sia asincrono, ma come verificare se è stato eseguito. dove devo aggiungere la richiamata?
Adi Prasetyo

1
Imbattuti in questo e ho pensato che questo era interessante da aggiungere alla must, shall, maycommento di cui sopra RFC2119 ietf.org/rfc/rfc2119.txt~~V~~singular~~3rd
mistertee

1
Vedo anche un comportamento di tipo asincrono. Quando salvo un oggetto vuoto in un elemento, noto che durante il recupero dei dati dell'elemento immediatamente dopo, restituisce i vecchi dati prima del salvataggio. Se dovessi indovinare, probabilmente è solo il ritardo della scrittura su disco
sookie

@sookie Il sistema operativo dovrebbe nascondere eventuali problemi hardware come quello. Le applicazioni vengono lette dalla cache del buffer del sistema operativo, non direttamente dal disco.
Barmar

-6

Questa domanda è già stata risolta. Per chiunque arrivi a questo in futuro, javascript è sincrono per natura. Le cose sono asincrone solo se sono specificate per farlo. Per questo motivo, puoi presumere che tutte le cose siano sincrone a meno che non siano specificate come asincrone. Questo è con javascript, non framework scritti in Javascript. A volte interrompono questa pratica. Come NodeJs.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.