Получение объекта Date из хранилища Chrome не работает
В расширении Chrome я пытаюсь сохранить объект Date в хранилище, а затем прочитать его обратно. Согласно официальной документации,
Значения с типом "object" и "function" обычно сериализуются в {}, за исключением Array (сериализуется, как ожидается), Date и Regex (сериализуются с использованием их представления String).
Я сохраняю в хранилище как:
var value= new Date(Date.now());
chrome.storage.sync.set({"testdate":value}, function(){
console.log("saved testdate to storage:");
console.log(value);
});
Выходные данные регистрации значения
Вт 16 октября 2018 08:22:11 GMT-0700 (тихоокеанское летнее время)
Я позже извлекаю из хранилища как:
chrome.storage.sync.get("testdate", function(items){
console.log("test date from storage:");
console.log(items.testdate);
});
В этом случае значение logging items.testdate равно:
Прото объекта: конструктор: ƒ Object() hasOwnProperty: ƒ hasOwnProperty() isPrototypeOf: ƒ isPrototypeOf() propertyIsEnumerable: ƒ propertyIsEnumerable() toLocaleString: ƒ toLocaleString() toString: et toString () valueG) defineSetter: ƒ defineSetter () lookupGetter: ƒ lookupGetter () lookupSetter: ƒ lookupSetter () получить прото: ƒ proto () установить прото: (proto ()
Не могу понять, как вернуть мой объект Date (или строковое представление для преобразования обратно в Date)
2 ответа
Сторона установки
const currentTime = (new Date()).toJSON();
const items = { 'testdate': currentTime };
chrome.storage.local.set(items, () => {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError.message);
}
});
Получение стороны
chrome.storage.local.get(['testdate'], (result) => {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError.message);
} else {
const storedJSONDate = result['testdate'];
const testdate = new Date(storedJSONDate);
console.log(testdate);
}
});
Источники
Я основал свой код на Date.prototype.toJSON, в котором говорится
var jsonDate = (new Date()).toJSON(); var backToDate = new Date(jsonDate); console.log(jsonDate); //2015-10-26T07:46:36.611Z
Из официальной документации по хранилищу Chrome, я думаю, говорится, что Date не будет сериализоваться должным образом. Поскольку он указывает, как сериализуется массив и регулярное выражение, но не как сериализуется Date, я думаю, что он сериализуется в{}
, что я получил, когда не включил toJSON()
части.
Объект, который предоставляет каждую пару ключ / значение для обновления хранилища. Никакие другие пары ключ / значение в хранилище не будут затронуты. Примитивные значения, такие как числа, будут сериализованы должным образом. Значения с типом "объект" и "функция" обычно сериализуются в {}, за исключением Array (сериализуется, как ожидалось), Date и Regex (сериализуются с использованием их строкового представления).
Также можно использовать
getTime()
:
//set
const currentTime = (new Date()).getTime(); //equals (new Date()).valueOf()
const items = {'testdate': currentTime};
chrome.storage.local.set(items);
//get
chrome.storage.local.get('testdate', (items) => {
const time = items['testdate'];
const testdate = new Date(time);
console.log(testdate);
});