Czy HTML5 localStorage jest asynchroniczny?

129

Czy setItem(key,value)funkcja jest asynchroniczna?

localStorage.setItem("key",someText);
jas7
źródło
1
Nie powinienem tak myśleć. Downvoter: jakie jest twoje uzasadnienie?
Waleed Khan

Odpowiedzi:

157

Nie, wszystkie localStoragepołączenia są synchroniczne.

Ryan Nigro
źródło
5
Moim oryginalnym źródłem była dokumentacja Mozilla Localstorage, ale wygląda na to, że została poprawiona od tego czasu (a specyfikacja W3 nie wymaga nigdzie synchronizacji / asynchronizacji). W tym momencie powiedziałbym, że wywołania lokalnego magazynu są synchroniczne zgodnie z konwencją, ale nie specyfikacją. Chyba że znasz przeglądarkę, która zaimplementowała ją asynchronicznie?
Ryan Nigro,
36
mój problem polega na tym, że ustawiam token uwierzytelniania w lokalnej pamięci, a następnie przekierowuję użytkownika do innego widoku. Czasami w nowym widoku dostęp do lokalnej pamięci masowej stwierdza, że ​​token nie został jeszcze zapisany, więc muszę użyć limitu czasu, ale nadal nie jest w 100% niezawodny.
The Muffin Man
@TheMuffinMan: Twój problem jest prawdopodobnie związany z tokenem autoryzacji nbflub expz niego.
Mendes,
3
To samo dla mnie, dziwne rzeczy
patotoma
Mam ten sam problem ... to dziwne zachowanie.
Daniel T. Sobrosa
62

Tak właściwie. magazyn sieciowy nie jest już częścią podstawowego standardu HTML5, został oddzielony.

Odpowiednią (roboczą) specyfikację można znaleźć tutaj, a jedyną rzeczą, którą zauważysz, jest to, że nigdzie nie wspomina o synchronizacji ani asynchroniczności.

Jednak analiza tekstu sugerowałaby, że musi on być synchroniczny (moje pogrubienie):

Metoda setItem (klucz, wartość) musi najpierw sprawdzić, czy para klucz / wartość z podanym kluczem już istnieje na liście skojarzonej z obiektem.

Jeśli tak nie jest, do listy należy dodać nową parę klucz / wartość z podanym kluczem i wartością ustawioną na wartość.

Jeśli dany klucz istnieje na liście, a jego wartość nie jest równa wartość, to musi mieć zaktualizowaną wartość do wartości. Jeśli jej poprzednia wartość jest równa value, metoda nie może nic zrobić.

W normach, jak słowa must, shalli mayprzeprowadzić bardzo konkretne znaczenie. Fakt, że mówi o tym, co metoda musi zrobić, oznacza, że ​​sama metoda musi to zrobić, a nie odkładać na jakiś czas później.

Dotyczy to również zdrowego rozsądku. Gdyby setItembyły asynchroniczne, możliwe byłoby ustawienie elementu na określoną wartość, a następnie natychmiastowe pobranie go, uzyskując jego poprzednią wartość.


Na dole sekcji interfejsu pamięci znajduje się uwaga, która wskazuje na możliwość zachowania asynchronicznego:

Ta specyfikacja nie wymaga, aby powyższe metody czekały, aż dane zostaną fizycznie zapisane na dysku. Wymagana jest tylko spójność w tym, jakie różne skrypty uzyskujące dostęp do tej samej podstawowej listy par klucz / wartość widzą.

Jednak dotyczy to tylko tego, co zostało zapisane w pamięci długoterminowej. Ostatnie zdanie nakazuje, aby skrypty korzystające z tego samego obiektu pamięci masowej widziały rzeczy synchronicznie.

paxdiablo
źródło
2
Rzeczywiście, rzeczy niekoniecznie są od razu przenoszone na dysk, więc jeśli zamkniesz i ponownie otworzysz stronę, możesz nie mieć najnowszych zapisanych elementów. Przetestowałem to w aplikacji hybrydowej na Androida i sprawia to, że użycie localStorage jest w niektórych przypadkach niewłaściwe.
user276648
1
Muszę przechowywać jakiś obiekt, który muszę na innej stronie, najbardziej odpowiednie jest użycie LocalStorage. Kiedy przechowuję 10 pozycji, brakuje mi 3 z nich. Naprawdę wierzę, że jest asynchroniczny, ale jak sprawdzić, czy tak się stało. gdzie mam dodać oddzwonienie?
Adi Prasetyo
1
Natknęliśmy się na to i że to było interesujące, aby dodać do must, shall, maykomentarz powyżej RFC2119 ietf.org/rfc/rfc2119.txt
mistertee
1
Widzę również zachowanie asynchroniczne. Kiedy zapisuję pusty obiekt do elementu, zauważam, że pobierając dane elementu natychmiast po tym, zwraca stare dane przed zapisaniem. Jeśli miałbym zgadywać, to prawdopodobnie tylko opóźnienie zapisu na dysk
sookie
@sookie System operacyjny powinien ukrywać takie problemy ze sprzętem. Aplikacje odczytywane z pamięci podręcznej bufora systemu operacyjnego, a nie bezpośrednio z dysku.
Barmar
-6

Na to pytanie już udzielono odpowiedzi. Dla każdego, kto przyjdzie do tego w przyszłości, javascript jest z natury synchroniczny. Rzeczy są tylko asynchroniczne, jeśli zostały określone, aby to robić. Z tego powodu możesz założyć, że wszystkie rzeczy są synchroniczne, chyba że są określone jako asynchroniczne. Dotyczy to javascript, a nie frameworków napisanych w Javascript. Czasami łamią tę praktykę. Podobnie jak NodeJs.

Scott
źródło