0

有没有一种简单的方法可以在 Firefox SDK 插件中本地存储带有 TTL 的 JSON 值?

据我所知,Firefox 强迫你使用他们的'simple-storage'库。我不能使用第三方库,例如jStorage

4

1 回答 1

1

不,simple-storageDOM Storage 是完全不同的东西,这意味着你不能使用像 jStorage 这样的库,它是用于 DOM Storage 的。

再说一次,存储 JSON 和实现 TTL 很简单,可以自己实现。对于 JSON,您使用JSON.parseJSON.stringify。对于 TTL,您只需将 TTL 值存储在某处并在必要时查找它们。像这样的东西:

var AdvancedStorage = {
  _storage: require("simple-storage").storage,

  // Keep TTL data in a special storage field
  _ttlData: null,
  _readTTLData() {
    if (this._storage._ttl)
      this._ttlData = JSON.parse(this._storage._ttl);
    else
      this._ttlData = {};
  },
  _saveTTLData() {
    this._storage._ttl = JSON.stringify(this._ttlData);
  },

  // Special data manipulation functions
  set: function(key, value, options) {
    this._storage[key] = JSON.stringify(value);
    this.setTTL(key, options && "TTL" in options ? options.TTL : 0);
  },

  get: function(key, default) {
    if (!this._storage.hasOwnProperty(key))
      return default;

    // Check whether setting has expired
    if (!this._ttlData)
      this._readTTLData();
    if (this._ttlData.hasOwnProperty(key) && this._ttlData[key] <= Date.now())
      return default;

    return JSON.parse(this._storage[key]);
  },

  deleteKey: function(key) {
    delete this._storage[key];
  },

  // Setting the TTL value
  setTTL(key, ttl) {
    if (!this._ttlData)
      this._readTTLData();
    if (ttl > 0)
      this._ttlData[key] = Date.now() + ttl;
    else
      delete this._ttlData[key];
    this._saveTTLData();
  }
};

我没有测试此代码,但这应该是实现此类功能所需的几乎所有代码。

于 2012-09-04T12:02:49.517 回答