Комментарии 35
Асинхронно?! Ну уж нет.
Асинхронно только сохранение данных в localStorage. В остальном, это обычный объект.
Асинхронно только сохранение данных в localStorage.отнюдь
Предлагаете гадать, что вы имели в виду?
Вся работа с localStorage синхронна
Нет, конкретно в моём скрипте сохранение данных асинхронно.
И зачем??? Тем более без колбэков.
Все очень хитро — это так надо jsfiddle.net/WFNPS/2/ :)
Кстати, я добавил переменную timer, она поможет избежать ошибок при сохранении в localStorage. То есть:
Обновляем страницу
Спасибо Гвоздю с JavaScript.ru
oblectLocalStorage = 1;
oblectLocalStorage = 2;
Обновляем страницу
oblectLocalStorage == 2; // true ← всегда
Спасибо Гвоздю с JavaScript.ru
Идея хорошая, но текущая реализация и невозможность сделать нормальную поддержку старых браузеров убивает ее на корню.
Мне не довольно-таки часто попадаются проекты, в которых можно забить на старые браузеры. Тем более, здесь поддерживается девятый осёл. А реализация косячная, не спорю. Но, если задача позволяет, эти косяки можно учесть.
Поддерживать код, особенно новому в проекте программисту будет сложно:
objectLocalStorage.foo = 1;
objectLocalStorage.foo = 2;
console.log(objectLocalStorage.foo); // неопределенное поведение
Почему? Вполне определенное, вернется 2. Неопределенным оно будет только если он запросит localStorage. Для сохранения в него требуется таймаут, да и только. В остальном, поведение такое же, как и у обычного объекта. Перечитайте еще раз код, должно быть понятнее. При гете objectLocalStorage (точнее при сете в дочернем объекте) _objectLocalStorage возвращается сразу, без таймаутов.
Хорошее решение. Удобное.
Во всех современных браузерах работает? (я о последних версиях firefox, opera и chrome)
Во всех современных браузерах работает? (я о последних версиях firefox, opera и chrome)
Несколько советов:
1. localStorage может выбрасывать исключение как на чтение так и на запись. т.е. при такой реализации можно ловить баг-фантом :)
2. писать в localStorage дорого (по сравнению с объектом), читать тоже (в некоторых браузерах читать не очень дорого). т.е. при таком юзкейсе — сохранение состояния приложения с постоянным JSON.stringify будет много операций с диском. Если rps меньше раза в секунду — можно забить на это.
Поясните смысл
1. localStorage может выбрасывать исключение как на чтение так и на запись. т.е. при такой реализации можно ловить баг-фантом :)
2. писать в localStorage дорого (по сравнению с объектом), читать тоже (в некоторых браузерах читать не очень дорого). т.е. при таком юзкейсе — сохранение состояния приложения с постоянным JSON.stringify будет много операций с диском. Если rps меньше раза в секунду — можно забить на это.
Поясните смысл
setTimeout( function(){
...
}, 0);
А смысл таков:
objectLocalStorage = { a: 4 };
objectLocalStorage.b = 5; ←
Срабатывает геттер, при этом, присваивания еще не произошло. Только по возврату (return ниже) _objectLocalStorage к ключу «b» присваивается 5. После возврата, в геттере мы ждем всего момент для того, чтоб сохранить этот объект в localStorage. Если убрать таймаут, то в хранилище попадет только { a: 4 }, но никак не { a: 4, b: 5 }.
objectLocalStorage = { a: 4 };
objectLocalStorage.b = 5; ←
Срабатывает геттер, при этом, присваивания еще не произошло. Только по возврату (return ниже) _objectLocalStorage к ключу «b» присваивается 5. После возврата, в геттере мы ждем всего момент для того, чтоб сохранить этот объект в localStorage. Если убрать таймаут, то в хранилище попадет только { a: 4 }, но никак не { a: 4, b: 5 }.
Все функции JSON.stringify localStorage.setItem localStorage.getItem включая геттер и сеттер синхронны, что там может не записаться?!
см. jsfiddle.net/9H7Wu/1/ vs jsfiddle.net/WFNPS/1/ (без таймаута)
см. jsfiddle.net/9H7Wu/1/ vs jsfiddle.net/WFNPS/1/ (без таймаута)
habrahabr.ru/post/143597/#comment_4814301 — не туда написал.
console.log(JSON.stringify(objectLocalStorage) === localStorage.objectStorage); // true
console.log(JSON.stringify(objectLocalStorage) ← здесь вы вызвали геттер, в геттере значение _objectLocalStorage записалось в localStorage.
Поэтому они и равны.
jsfiddle.net/WFNPS/2/
console.log(JSON.stringify(objectLocalStorage) ← здесь вы вызвали геттер, в геттере значение _objectLocalStorage записалось в localStorage.
Поэтому они и равны.
jsfiddle.net/WFNPS/2/
Понял идею. Не совсем честно (при некоторых случаях возможны баги т.к ожидается, что запись в LS будет синхронна), но для целей подходит jsfiddle.net/WFNPS/4/
Мне кажется проще читать и писать в обычный объект, который сериализуется в LS (по таймауту и при onbeforeunload), и десериализуется при старте приложения.
Хм… Интересный вариант. Хотя… А если свет вырубят или БСОД наступит?
document.addEventListener('onBeforeBSOD', function(){
... //save your data
});
У нас таким образом реализовано кеширование некоторых «тяжелых» тимплейтов на клиенте. При сериализации в LS пишем ключ, что-то типа «сериализация прошла успешно, от такой-то даты».
При попытке десериализации сперва смотрим в этот ключ — если вдруг его нет, запрашиваем кеш с сервера, и пишем в LS.
При попытке десериализации сперва смотрим в этот ключ — если вдруг его нет, запрашиваем кеш с сервера, и пишем в LS.
Я тут подумал… Этот вариант — лучший для sessionStorage. Но для localStorage всё еще сомневаюсь. Может быть сохранять данные каждые N секунд?
А почему ты считаешь что в ИЕ ниже девятой версии не будет работать? В ИЕ8 точно будет работать, defineProperty там есть, localStorage тоже есть, defineProperty на объект window вполне работает норм. Так что в ИЕ ниже восьмой версии это не будет работать, но в ИЕ8 вполне будет пахать нормально.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Работа с локальным хранилищем, как с объектом? Легко!