Является ли HTML5 localStorage асинхронным?


Ответы:


157

Нет, все localStorageзвонки синхронные.


5
Моим исходным источником были документы Mozilla localstorage, но похоже, что с тех пор они были пересмотрены (и спецификация W3, похоже, нигде не требует синхронизации / асинхронности). На этом этапе я бы сказал, что вызовы localstorage синхронны по соглашению, но не по спецификации. Если вы не знаете, в каком браузере он реализован асинхронно?
Райан Нигро

36
Моя проблема в том, что я устанавливаю токен аутентификации в локальном хранилище, а затем перенаправляю пользователя в другое представление. Иногда при доступе к новому представлению локальное хранилище обнаруживает, что токен еще не сохранен, поэтому я должен использовать тайм-аут, но все еще не на 100% надежен.
The Muffin Man

@TheMuffinMan: Вероятно, ваша проблема связана с токеном аутентификации nbfили expс ним.
Мендес

3
То же самое для меня, странные вещи
patotoma

У меня та же проблема ... странное поведение.
Даниэль Т. Соброса,

62

Фактически. веб-хранилище больше не является частью основного стандарта HTML5, оно было выделено.

Соответствующую (черновую) спецификацию можно найти здесь, и вы заметите, что в ней нигде не упоминается ни синхронный, ни асинхронный.

Однако анализ текста предполагает, что он должен быть синхронным (выделено жирным шрифтом):

Метод setItem (ключ, значение) должен сначала проверить, существует ли уже пара ключ / значение с данным ключом в списке, связанном с объектом.

Если это не так, то в список необходимо добавить новую пару ключ / значение с заданным ключом и значением, равным значению.

Если данный ключ действительно существует в списке и его значение не равно значению, тогда его значение должно быть обновлено до значения. Если его предыдущее значение равно значению, то метод ничего не должен делать.

В стандартах, такие слова , как must, shallи mayносить очень конкретные значения. Тот факт, что здесь говорится о том, что должен делать метод , означает, что это должен делать сам метод, а не откладывать это на более позднее время.

Это также соответствует здравому смыслу. Если бы они setItemбыли асинхронными, можно было бы установить для элемента определенное значение, а затем немедленно получить его, получив его предыдущее значение.


В нижней части раздела интерфейса хранилища есть примечание, намекающее на возможность асинхронного поведения:

Эта спецификация не требует, чтобы вышеуказанные методы ожидали, пока данные будут физически записаны на диск. Требуется только согласованность в том, что видят разные сценарии, обращающиеся к одному и тому же базовому списку пар ключ / значение.

Однако это только с точки зрения того, что записано на длительное хранение. Последнее предложение требует, чтобы сценарии, обращающиеся к одному и тому же объекту хранения, могли видеть вещи синхронно.


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

1
Мне нужно сохранить какой-то объект, который мне нужно, на другой странице, наиболее подходящим является использование LocalStorage. Когда я храню 10 предметов, я пропускаю 3 из них. Я действительно считаю, что это асинхронно, но как проверить, выполнено ли. где мне добавить обратный вызов?
Adi Prasetyo 09

1
Наткнулся на это и думал , что это было интересно , чтобы добавить к must, shall, mayкомментарий выше RFC2119 ietf.org/rfc/rfc2119.txt
mistertee

1
Я также наблюдаю асинхронное поведение. Когда я сохраняю пустой объект в элемент, я замечаю, что при извлечении данных элемента сразу же после этого возвращаются старые данные до сохранения. Если бы я догадался, это, вероятно, просто задержка записи на диск
sookie

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

-7

На этот вопрос уже дан ответ. Для всех, кто придет к этому в будущем, JavaScript по своей природе синхронен. Вещи только асинхронны, если они предназначены для этого. Из-за этого вы можете предположить, что все объекты синхронны, если они не указаны как асинхронные. Это с javascript, а не с фреймворками, написанными на Javascript. Иногда они нарушают эту практику. Как NodeJs.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.