【问题标题】:chrome.storage.local strange behaviour: confused by a duplicate objectchrome.storage.local 奇怪的行为:被重复的对象弄糊涂了
【发布时间】:2016-04-26 18:28:02
【问题描述】:

经过大量的寻找错误后,我设法将问题缩小到这段代码:

dup = {a: [1]}
chrome.storage.local.set({x: [dup, dup]});
chrome.storage.local.get(["x"], function(o) {console.log(JSON.stringify(o['x']));});

打印出来的是:[{"a":[1]},null]

我发现这是一种非常奇怪的行为。所以我的问题是:

  1. 这是故意的吗?有记录吗?

  2. 您能否推荐一个绕过此限制的好解决方案?

我目前的想法是使用 JSON.stringify (它可以正确处理这种情况),然后再解析字符串。但这似乎很浪费。

谢谢。

【问题讨论】:

    标签: google-chrome-extension


    【解决方案1】:
    1. 不,这不是故意的,应该将 reported 作为一个错误:https://crbug.com/606955(现在它已从 Chrome 52 开始修复!)。
    2. 正如我在错误报告中所解释的,错误的原因是对象相同。如果您的对象 dup 仅包含简单值(即没有嵌套数组或对象,只有原始值,如字符串、数字、布尔值、null 等),那么对象的浅层克隆就足够了:

      dup = {a: [1]}
      dup2 = Object.assign({}, dup);
      chrome.storage.local.set({x: [dup, dup2]});
      

      如果您需要对嵌套对象的支持,那么您必须进行深度克隆。现有的库或者代码sn-ps有很多,这里不再赘述。为chrome.storage 准备值的一种简单方法是将其序列化为 JSON,然后再次解析(然后所有对象都是唯一的)。

      dup = {a: [1]}
      var valueToSave = JSON.parse(JSON.stringify([dup, dup]));
      chrome.storage.local.set({x: valueToSave});
      
      // Or:
      var valueToSave = [ dup, JSON.parse(JSON.stringify(dup)) ];
      chrome.storage.local.set({x: valueToSave});
      

    【讨论】:

    • 我认为问题不在于 api 的异步性质,而不是实际问题
    • @ZigMandel 虽然你不应该依赖它,但在存储它之后获取一个值目前是同步的。即使您考虑到异步性质(正如我在错误报告中所做的那样),错误仍然会出现。我实际上检查了source code of ChromeUpdateAndCheckUniqueness 部分是罪魁祸首)并发现了存在实施缺陷的证据(有关详细信息,请参阅错误报告)。
    • chrome 中没有 JSON.serialize。你是说字符串化吗?
    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 2022-01-23
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多