chrome.storage没有按预期工作

时间:2016-07-01 10:51:52

标签: javascript google-chrome-extension google-chrome-storage

我正在尝试在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;
      });     
    });
  } 
}

1 个答案:

答案 0 :(得分: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存储有一种更有效的方法来设置默认(如果不存储)值:

    chrome.storage.sync.get({key: "defaultValue"}, function(data) {
      // data.key will be the stored value, or "defaultValue" if not in storage
    });
    
  4. 因此,如果我正确理解了代码的用途(将dic_url附加到存储中的goal),就可以执行此操作:

    // 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