0

我正在尝试将字典对象列表保存在 chrome 存储中。但是以下代码似乎无法按预期工作。

当扩展第一次加载并且存储中没有goal对象时,runtime.lasterror应该设置对象并执行该部分中的代码。但事实并非如此。

当我取消注释该chrome.storage.sync.set行并保存对象时,下次我调用期望它保存列表的函数时,它不会。它不提供任何警报框。

function isPgUrl(pg_url,gl_name) {
  if(pg_url && gl_name) {

    dic_url={
      "name":gl_name,
      "pg_url":pg_url
    }

    //chrome.storage.sync.set({"goal":[dic_url]});

    chrome.storage.sync.get(["goal"], function(data) {
      if(chrome.runtime.lastError) {
        chrome.storage.sync.set({"goal":[dic_url]},function() {
          alert("blah");
        });
        alert("here");
        return;
      }
      var list=data.goal;
      list.append(dic_url);
      alert(list);
      chrome.storage.sync.set({"goal":list},function() {
        alert("lalala");
        return;
      });     
    });
  } 
}
4

1 回答 1

1
  1. 你永远不会chrome.runtime.lastError因为丢失的数据而被设置。这也不例外——你只是得到了undefined价值。所以你的支票应该是:

    if(!data.goal) { ... }
    

    或者

    if(typeof data.goal === "undefined") { ... }
    
  2. 如果取消注释该行,则需要注意这chrome.storage是异步的:数据在.set(). 因此,您.get()在调用后立即执行的操作.set()可能会获得存储的旧视图的快照 - 使您的代码在list.append(dic_url);

    并不是Array.prototype.append一开始就存在的。你应该使用.push().

  3. Chrome 存储有一种更有效的方法来设置 default-if-not-in-storage 值,方法是使用 Object 作为查询:

    chrome.storage.sync.get({key: "defaultValue"}, function(data) {
      // data.key will be the stored value, or "defaultValue" if not in storage
    });
    

因此,如果我正确理解了您的代码的用途(附加dic_urlgoal存储中),则可以这样做:

// Makes more sense to default to empty list
chrome.storage.sync.get({goal: []}, function(data) {
  var list = data.goal;
  list.push(dic_url);
  chrome.storage.sync.set({goal: list}, function() {
    // Stoarge updated, dic_url appended to goal
  });
  // Storage is not yet updated - set() is async
});
// Storage is not yet updated - get()/set() are async
于 2016-07-01T11:04:54.373 回答