将本地存储转换为Chrome存储以获取和设置

时间:2013-05-23 07:58:50

标签: javascript google-chrome local-storage

我有一个用户脚本,我已经为使用Chrome的用户转换为Chrome扩展程序。用户脚本设置主题并具有可供选择的主题,但仅使用localStorage,除主子域之外的任何内容都将具有默认主题。我希望使用Chrome的存储API可以缓解这种情况,但我对如何使其工作感到难过。

这是原始代码:

  hasGM: typeof GM_deleteValue !== "undefined",
  get: function(name)
  {
    var val = this.hasGM ?
          GM_getValue(NAMESPACE + name) :
          localStorage.getItem(NAMESPACE + name);

    if (val != undefined)
      return JSON.parse(val);

    return defaultConfig[name];
  },
  set: function(name, val)
  {
    name = NAMESPACE + name;

    if (typeof val !== "number")
      val = JSON.stringify(val);

    return this.hasGM ?
        GM_setValue(name, val) :
        localStorage.removeItem(name, val),
        localStorage.setItem(name, val);
  }
},

这就是我到目前为止所处的内容,即使我可以在控制台中完美地执行一个console.log结果[NAMESPACE + name]和值,也将val打印为undefined。

  hasGM: typeof GM_deleteValue !== "undefined",
  get: function(name)
  {
    names = NAMESPACE + name;
    var val = this.hasGM ?
          GM_getValue(names) :
          chrome.storage.local.get(names, function(result){return result[NAMESPACE + name];});

    if (val != undefined)
      return JSON.parse(val);
    console.log(val);
    return defaultConfig[name];
  },
  set: function(name, val)
  {
    name = NAMESPACE + name;
    setObj={};
    setObj[name]=val;


    if (typeof val !== "number" && this.hasGM)
      val = JSON.stringify(val);
    return this.hasGM ?
        GM_setValue(name, val) :
        chrome.storage.local.remove(name),
        chrome.storage.local.set(setObj);
  }

基本上我无法绕过它并需要一些帮助

    for (var key in defaultConfig)
      $SS.conf[key] = parseVal(key, this.get(key, function(_arg) {
        var val;

        val = _arg[key];
        return callback(val);
      }));

1 个答案:

答案 0 :(得分:3)

这是你可以做的事情,我省略了hasGM的东西以简化事情:

get: function(name, callback) {

  names = NAMESPACE + name;
  chrome.storage.local.get(names, function(val){
    if (val != undefined) {
      callback(JSON.parse(val));
    } else {
      callback(defaultConfig[name]);
    }
  })
},

所以这意味着调用你的get函数的代码也必须改变,对不起,但实际上没有其他办法。您可以(并且大多数人会)将您的同步内容转换为使用回调模式,例如:

get: function(name, callback) {

  names = NAMESPACE + name;
  if(this.hasGM) {
    callback(GM_getValue(names));
  } else {
    chrome.storage.local.get(names, function(val){
      if (val != undefined) {
        callback(JSON.parse(val));
      } else {
        callback(defaultConfig[name]);
      }
    })
  }
},

处理异步函数的一些规则:

  • 他们什么都不退货! (除非他们是基于承诺的)
  • 在回调中返回一些内容毫无意义,它不会去任何地方!
  • 回调之外的代码通常会在回调之前运行,总是假设回调将在稍后的某个时间执行,因此你不能依赖回调中的任何变量设置/发生!
相关问题