Чи асинхронний HTML5 localStorage?


Відповіді:


158

Ні, всі localStorageдзвінки синхронні.


5
Моїм оригінальним джерелом були документи Mozilla localstorage, але, схоже, вони були переглянуті з тих пір (а специфікація W3, схоже, не вимагає синхронізації / асинхронізації ніде). На даний момент я б сказав, що дзвінки в місцеві магазини є синхронними за умовами, але не за специфікацією. Якщо ви не знаєте браузера, який реалізував його асинхронізацію?
Райан Нігро

35
моя проблема полягає в тому, що я встановлюю марку аутентифікації в локальному сховищі, а потім перенаправляю користувача на інший вигляд. Іноді в новому представленні доступу до локальної пам’яті виявляється, що маркер ще не збережений, тому мені доводиться використовувати тайм-аут, але все ще не на 100% надійний.
The Muffin Man

@TheMuffinMan: Ваша проблема, ймовірно, пов’язана з ознакою автентичності nbfабо expз нею.
Мендес

3
Те саме для мене, дивні речі
патотома

Я стикаюся з тією ж проблемою ... її дивна поведінка.
Даніель Т. Соброса

62

Насправді. веб-сховище вже не є частиною основного стандарту HTML5, його розділено.

Відповідний (проект) специфікації можна знайти тут , і одна річ , яку ви помітите, що це не кажучи вже про синхронної або асинхронної де - небудь.

Однак аналіз тексту дозволяє припустити, що він повинен бути синхронним (моїй жирним шрифтом):

Метод setItem (ключ, значення) повинен спочатку перевірити, чи пара / ключ / значення з даним ключем вже існує у списку, пов’язаному з об'єктом.

Якщо цього не відбувається, то до списку потрібно додати нову пару ключ / значення , із заданим ключем та його значенням.

Якщо даний список існує в списку, а його значення не дорівнює значенню, то це повинно бути оновлене до значення. Якщо його попереднє значення дорівнює значенню, то метод не повинен нічого робити.

У стандартах, такі слова , як must, shallі mayносити дуже конкретні значення. Той факт, що це говорить про те, що повинен робити метод , означає, що сам метод повинен це робити, а не відкладати на якийсь більш пізній час.

Це також відповідає здоровому глузду. ЯкщоsetItem асинхронні, можна було б встановити елемент на певне значення, а потім негайно отримати його, отримавши його попереднє значення.


там є примітка в нижній частині секції інтерфейсу зберігання , який натякає на можливість асинхронного поведінки:

Ця специфікація не вимагає, щоб вищезазначені методи чекали, поки дані фізично не будуть записані на диск. Потрібна лише узгодженість того, що бачать різні сценарії, що отримують доступ до одного і того ж базового списку пар ключів / значень.

Однак це лише з точки зору того, що записано на довготривале зберігання. Останнє речення передбачає, що сценарії, що звертаються до одного об’єкта зберігання, потрібні для того, щоб бачити речі синхронно.


2
Дійсно, речі не обов'язково видаються на диск відразу, тому якщо ви закриєте, то відкрийте знову свою сторінку, можливо, у вас не буде останніх елементів, які ви зберегли. Я перевірив це в гібридному додатку в Android, і це робить використання localStorage в деяких випадках неприйнятним.
користувач276648

1
Мені потрібно зберігати якийсь об’єкт, який я маю на різних сторінках, найбільш підходящим є використання LocalStorage. Коли я зберігаю 10 предметів, я пропускаю 3 з них. Я дійсно вважаю, що це асинхронно, але як перевірити, чи це було зроблено. куди мені додати зворотній дзвінок?
Аді Прасетьо

1
Натрапив на це і думав , що це було цікаво , щоб додати до must, shall, mayкоментар вище RFC2119 ietf.org/rfc/rfc2119.txt
mistertee

1
Я також бачу асинхронну поведінку. Коли я зберігаю порожній об’єкт на елементі, я помічаю, що при отриманні даних елемента негайно після цього повертає старі дані перед збереженням. Якби я здогадувався, ймовірно, це просто затримка запису на диск
sookie

@sookie Операційна система повинна приховувати подібні апаратні проблеми. Програми читаються з буфера кешу операційної системи, а не безпосередньо з диска.
Бармар

-6

На це питання вже відповіли. Для всіх, хто в майбутньому прийде до цього, javascript синхронний за своєю природою. Речі є лише асинхронізованими, тому вони визначені для цього. Через це ви можете припустити, що всі речі є синхронними, якщо вони не визначені як асинхронні. Це з JavaScript, а не рамки, написані на Javascript. Вони часом порушують цю практику. Як і NodeJs.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.