2015-04-01 7 views
1

У меня есть функция, которая получает данные из chrome.storage и загружает ее в массив, все работает нормально, если я сохраняю пустой массив в chrome.storage, используя строку кода затем вынимая его, прежде чем использовать расширение в качестве пользователя.Проверка наличия данных в chrome.storage.sync

Проблема заключается в том, что пользователь не может сделать это, если я начну расширение в первый раз, не делая это, то он выглядит как хром проходит обратно неопределенный в переменную, которая вызывает эту ошибку:

"Uncaught TypeError: Cannot read property '8' of undefined"

на этой линии:

if (SavedReminders[i][8] == "Full") { 

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

Вот моя функция нагрузки:

function LoadFromFile() { 
    reminds = {} 
    chrome.storage.sync.get({ reminds: [] }, function (result) { SavedReminders = result.reminds }); 
} 

и функция сохранения:

function SaveToFile() { 
    reminds={} 
    chrome.storage.sync.set({reminds:SavedReminders }, 
     function() { 
      console.log(SavedReminders, reminds); 
     }); 
} 

любая помощь будет оценена, спасибо.

ответ

1

Вы можете передать объект в api (вместо массива ключей) со значениями по умолчанию для каждой клавиши. Он вернет значение по умолчанию для ключей, которые присутствуют там.
вы также можете просто оставить его как есть и проверить, не является ли его == неопределенным, но мой предложенный способ чище.
подробности о том, как передать такой объект находятся на официальных API Docs для .storage: методы

https://developer.chrome.com/extensions/storage StorageArea: получить StorageArea.get(string or array of string or object keys, function callback) (дополнительно) ключи: ... «или словарь с указанием значения по умолчанию». ..

chrome.storage.local.get({foo:"hi", bar:"there"}) будет возвращен obj, где obj ["foo"] является "hi", когда еще не сохранено.

+1

«Вы можете передать объект в api со значениями по умолчанию для каждого ключа». ,...... как? – sports

+1

Ive обновил ответ –

+0

«вернется obj» - где ваш объект? Вы уверены, что это работает? Пробовал в Firefox 48 'all = chrome.storage.StorageArea.get ({foo:" hi ", bar:" there "});' freezed my Debugger – user1141649

1

В моем случае я искал словарь, и вызов, казалось, возвращал какой-то прототип объекта вместе со словарем (поэтому тип объекта не был «неопределенным»). Чтобы получить значение, которое я действительно искал, мне пришлось проверить свойство возвращаемого объекта.

chrome.storage.sync.get('profile', function(profileObj) { 
    var profile = profileObj.profile; 
    if (typeof profile === "undefined") { 
    // No profile in storage 
    } else { 
    // Profile exists in storage 
    } 
}); 
0

Также вы можете проверить, если storage.sync или storage.local возвращает неинициализированный хранилище с помощью обнаружения пустого объекта:

function _empty(o) { 
    return Object.keys(o).length === 0 && o.constructor === Object 
} 

Так линия if (SavedReminders[i][8] == "Full") { станет либо if(!_empty(SavedReminders)) или if (SavedReminders && SavedReminders[i] && SavedReminders[i][8] == "Full") {.

Смежные вопросы