为什么在检索时存储到chrome.storage.sync的Object方法不是函数?

时间:2016-12-03 23:51:33

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

我将Timer对象存储到chrome.storage.sync。当我检索Timer对象并尝试调用其中一个方法countdown()时,该方法不再存在:

  let clock = new Timer(1);
  let key = "myKey";
  chrome.storage.sync.set({[key]: clock});
  chrome.storage.sync.get(key, function(items){
    items[key].countdown();
  });

Chrome devTools说:“对存储的响应错误.get:TypeError:items [key] .countdown不是一个函数。”

2 个答案:

答案 0 :(得分:0)

您无法直接在chrome.storage中存储功能。

StorageArea.set()的文档非常明确[强调我的]:

  

数字等原始值将按预期序列化。 typeof "object""function"的值通常会序列化为{} ,但Array(按预期序列化),日期和正则表达式(使用它们的字符串表示序列化)。

这似乎是JSON的一个子集(JSON将序列化由基元组成的对象就好了)。但是,即使它是一个完整的JSON实现,它仍然不会存储函数:" JSON本身不代表更复杂的数据类型,如函数,正则表达式,日期等。"

答案 1 :(得分:0)

对于同样遇到此问题但尚未找到从多个位置访问函数的替代解决方案(不使用 chrome.storage)的任何人,您可以选择 Message passing要使用的函数及其创建位置。

上面的例子可以大致改写为:

在要调用函数的脚本中:

      chrome.runtime.sendMessage({startCountdown: true}, null);

在当前脚本中:

      let clock = new Timer(1);
      let key = "myKey";
      chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
        if (message.startCountdown === true) {
            clock.countdown();
        };
      });