chrome.storage.sync.get始终返回默认值

时间:2019-03-20 19:59:14

标签: google-chrome-extension chrome-extension-async

我正在开发chrome扩展程序,它需要我跟踪扩展程序的最后运行日期。为此,我使用的是chrome.storage.sync,但是,get调用始终返回我设置为默认值的值。下面是代码。

 chrome.storage.sync.get({theDate: {}}, function (dateResult) {
    let currentDate = new Date();
    let setDate = dateResult.theDate; // always set to {}
    if (Object.keys(setDate).length === 0){ //if date has never been set before
        setDate = currentDate;
    }
    if (setDate.toLocaleDateString() !== currentDate.toLocaleDateString()){
          //do stuff if it is a different day than the last time extension was run
    }


    chrome.storage.sync.set({theDate: currentDate}, function () {
        console.log("Current date set.");

    });

});

2 个答案:

答案 0 :(得分:2)

Chrome扩展存储API仅支持与JSON兼容的类型,例如字符串,数字,布尔值以及由这些原始类型组成的数组/对象。

Date对象不可使用JSON,因此无法存储。
您可以存储Date.now(),这是一个数字。

chrome.storage.sync.get({theDate: Date.now()}, ({theDate}) => {
  if (new Date(theDate).toLocaleDateString() !== new Date().toLocaleDateString()) {
    // do stuff if it is a different day than the last time extension was run
  }
  chrome.storage.sync.set({theDate: Date.now()});
});

答案 1 :(得分:1)

在存储Date对象之前,需要对其进行字符串化。使用JSON.stringifyString构造函数。另外,您可以调用Date作为常规函数,而不是构造函数来获取字符串对象,而不是Unix时间戳;或者,最好按照wOxxOm的建议,使用Date.now()以毫秒为单位获取日期。 1

我还必须注意,在第一个条件中,您检查从存储中检索的Date对象是否具有任何键,但是即使您可以存储原始Date对象,也应该没有。您可能会误解如何在存储中设置数据。本质上是dateResult === {theDate: currentDate}dateResult.theDate === currentDate2

编辑:包括wOxxOm的完整性建议。