0

我将 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 说:“响应 storage.get 时出错:TypeError:items[key].countdown 不是函数。”

4

2 回答 2

0

对于也遇到此问题并且尚未找到从多个位置(不使用chrome.storage)访问函数的替代解决方案的任何人,您可以选择在要使用该函数的位置和它所在的位置之间传递消息创建的。

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

在要调用该函数的脚本中:

      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();
        };
      });
于 2021-02-12T14:07:52.057 回答
0

您不能直接将函数存储在chrome.storage.

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

诸如数字之类的原始值将按预期进行序列化。带有 atypeof "object"和的值"function"通常会序列化为{},但 Array(按预期序列化)、Date 和 Regex(使用它们的 String 表示进行序列化)除外。

这似乎是 JSON 的一个子集 JSON 可以很好地序列化由原语组成的 Object)。然而,即使它是一个完整的 JSON 实现,它仍然不会存储函数:“JSON 本身并不表示更复杂的数据类型,如函数、正则表达式、日期等。”

于 2016-12-04T00:10:50.140 回答