乐趣区

关于localstorage:ExpiredStorage给localstroage增加超时功能-源码解读

https://www.npmjs.com/package…
这个库拓展了 localStroage。在设置 item 的时候,会另外再设置一个 key 用来存储过期工夫。当在取数据的时候判断是否过期并且 remove 元素。


用法

expiredStorage = new ExpiredStorage();

// 60 秒后过期
expiredStorage.setItem("test", "foobar", 60);
// 永不过期
expiredStorage.setItem("no_expire", "this will live forever");
// 获取数据,如果过期会返回 null
var item = expiredStorage.getItem("test");
// 获取剩余时间
var timeLeft = expiredStorage.getTimeLeft("test");
// 检测 key 是否过期
var isExpired = expiredStorage.isExpired("test");
 
// 获取所有的 key(如果 includeExpired 是 true,连过期没来的删除的 key 也一并返回)var keys = expiredStorage.keys(includeExpired);
 
// 返回这个 key 的详情
var data = expiredStorage.peek("test");

源码解读
构造函数,这块就是一些边界判断,没什么

function ExpiredStorage(storage) {
        ...
        this._storage = storage;
    }

重点是 setItemgetItem

ExpiredStorage.prototype = {
    // 根底 stroage 类,在构造函数中赋值
    _storage: null,
    // 工夫戳 key 的前缀
    _expiration_key_prefix: "__expired_storage_ts__",
    // 获取以后工夫 单位秒
    getTimestamp: function() {return Math.floor(((new Date).getTime()) / 1000);
    },
    setItem: function(key, value, expiration) {
        // set item
        var ret = this._storage.setItem(key, value);
        // 存储这个 key 对应的过期工夫 (仅仅在 expiration 有值的时候)
        if (expiration) {this.updateExpiration(key, expiration);
        }
        return ret;
    },
    // 更新 key 的过期工夫,新的 key 位工夫戳前缀加旧的 key
    updateExpiration: function(key, expiration) {return this._storage.setItem(this._expiration_key_prefix + key, this.getTimestamp() + expiration);
    },

    getItem: function(key) {
        // 判断是否过期,过期了就删除这一项,返回 null
        if (this.isExpired(key)) {this.removeItem(key);
            return null;
        }
        // 没过期就失常返回
        return this._storage.getItem(key);
    },

    // 判断是否过期
    isExpired: function(key) {var timeLeft = this.getTimeLeft(key);
        return timeLeft !== null && timeLeft <= 0;
    },

    // 获取剩余时间
    getTimeLeft: function(key) {
        // 通过工夫戳 key 拿到过期工夫
        var expireTime = parseInt(this._storage.getItem(this._expiration_key_prefix + key));

        // 取到值就返回剩余时间
        if (expireTime && !isNaN(expireTime)) {return expireTime - this.getTimestamp();
        }

        // 没取到值就返回 null
        return null;
    },
    // 同时删除 key 和工夫戳 key
    removeItem: function(key) {var ret = this._storage.removeItem(key);
        this._storage.removeItem(this._expiration_key_prefix + key);
        return ret;
    },
}

非常简单就实现了一个比拟麻烦的需要,这个仓库曾经四年没更新,还放弃着每周 1k 左右的下载量,拜服!!

退出移动版