【问题标题】:Properly storing an object in chrome.storage?在 chrome.storage 中正确存储对象?
【发布时间】:2015-03-19 13:59:09
【问题描述】:

我正在尝试使用 chrome.storage 在包含其他对象的 chrome 扩展中存储一个对象 - 但在初始化它和使用 chrome.storage.sync.get 正确获取它时遇到问题。我知道我应该以chrome.storage.sync.get(key: "value", function(obj) {} 的形式获取对象 - 问题是我不知道如何

  • 第一次用get初始化对象
  • 使用 set 正确更新我的对象

我有以下代码来创建对象并添加我需要的数据。

allData = {};
currentData = {some: "data", goes: "here"};
allData[Object.keys(allData).length] = currentData;

这将正确地给我一个对象,它的第一个键 (0) 设置为 currentData。 (Object: {0: {some: "data", goes: "here"}}) 按预期工作,allData[Object.keys(allData).length] = currentData; 稍后会正确地将当时的任何 currentData 推送到我的 Object 中。

但是如何正确地将其永久存储在 chrome.storage 中? chrome.storage.sync.get("allData", function(datas) {}) 无法创建空的 allData 变量,allData: {}allData = {} 以及各种返回 undefined 或其他错误的不同事物也是如此。如何正确初始化一个空对象并将其存储在 chrome.storage 中?或者我是否将这一切都搞错了,需要将其分解为关联数组才能使其工作?

我基本上需要将上面的一小块工作代码永久存储在 chrome.storage 中,以便我可以根据需要使用它。

【问题讨论】:

    标签: javascript google-chrome object google-chrome-extension associative-array


    【解决方案1】:

    您可以使用新的 JavaScript (ECMAScript 6) 轻松完成此操作,请查看 Enhanced Object Properties

    var currentData = {some: "data", goes: "here"};
    chrome.storage.local.set({allData: currentData });
    

    在旧的方式中,是这样的:

    var obj = {};
    var key = "auth";
    obj[key] += "auth";
    obj[key] = JSON.stringify({someKey: someValue});
    

    【讨论】:

    • 这实际上既没有回答问题,也没有使用链接的增强对象属性。
    【解决方案2】:

    首先需要设置存储里面的数据:

    allData = {};
    currentData = {some: "data", goes: "here"};
    
    // to initialize the all data using the storage
    chrome.storage.sync.get('allData', function(data) {
      // check if data exists.
      if (data) {
          allData = data;
      } else {
          allData[Object.keys(allData).length] = currentData;
      }
    });
    
    // Save it using the Chrome extension storage API.
    chrome.storage.sync.set({'allData': allData}, function() {
      // Notify that we saved.
      message('Settings saved');
    });
    

    之后,您应该能够使用chrome.storage.sync.get('allData', function(){ ... }) 接口访问数据。

    【讨论】:

    • 如何初始化? ie:如果它不在存储中,则将 allData 设置为 currentData。否则,在附加 currentData 之前从存储中设置 allData。
    • 看看上面的代码,我更新了get代码来初始化数据。
    • 此代码错误。 chrome.storage.get 是异步的,这意味着它在调用回调之前立即返回。这允许它下面的chrome.storage.set 调用在它被初始化时使用allData 的值立即运行(在这种情况下是一个空对象)。为确保您 set 仅在您 get 数据之后(以便 allData 实际保存检索到的数据),您必须将 set 调用放在 get 回调中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多