- 数据访问对象模式:抽象和封装一个对象,对数据源进行访问和存储,这样可以方便对数据的管理,以及避免数据之间的重复,覆盖等问题
/*
{
nameSpace|key: expire|value
}
*/
var DataVisitor = function (nameSpace, splitSign) {
this.nameSpace = nameSpace;
this.splitSign = splitSign || '|';
}
DataVisitor.prototype = {
status: {
SUCCESS: 0,
FAILURE: 1,
OVERFLOW: 2,
TIMEOUT: 3
},
getKey: function (key) {
return this.nameSpace + this.splitSign + key;
},
set: function (key, value, callback, expireTime) {
var status = this.status.SUCCESS;
key = this.getKey(key);
expireTime = expireTime ? expireTime + new Date().getDate() : -1;
try {
window.localStorage.setItem(key, expireTime + this.splitSign + value);
} catch (error) {
status = this.status.OVERFLOW;
}
callback && callback.call(this, status, key, value);
return value;
},
get: function (key, callback) {
key = this.getKey(key);
var status = this.status.SUCCESS;
var value = window.localStorage.getItem(key);
if (value) {
var index = value.indexOf(this.splitSign);
var time = value.slice(0, index);
if (time > new Date().getTime() || time === '-1') {
value = value.slice(index + this.splitSign.length);
} else {
value = null;
status = this.status.TIMEOUT;
window.localStorage.removeItem(key);
}
} else {
status = this.status.FAILURE;
}
callback && callback.call(this, status, key, value);
return value;
},
remove: function (key, callback) {
var status = this.status.FAILURE;
key = this.getKey(key);
value = window.localStorage.getItem(key);
if (value) {
value = value.slice(value.indexOf(this.splitSign) + this.splitSign.length);
window.localStorage.removeItem(key);
status = this.status.SUCCESS;
}
callback && callback.call(this, status, key, value);
}
}
var learnInPro = new DataVisitor('learnInpro');
// 操作一
learnInPro.set('aaa', '123', function (status, key, value) {
console.log(status, key, value);
});
learnInPro.get('aaa', function(status, key, value) {
console.log(status, key, value);
})
learnInPro.remove('aaa', function(status, key, value) {
console.log(status, key, value);
});
// 操作二
learnInPro.set('bbb', '456', function (status, key, value) {
console.log(status, key, value);
}, 1000 * 2);
learnInPro.get('bbb', function (status, key, value) {
console.log(status, key, value);
});
setTimeout(function () {
learnInPro.get('bbb', function (status, key, value) {
console.log(status, key, value);
})
}, 1000 * 3);