上一篇地址:Chrome 插件 030RateViewer 0.02版更新
说实话,并没有想到会这么快就更新插件。主要是因为昨天晚上碰巧在12点之后点开了插件,然后发现了数据同步的问题。
由于逻辑设定是当日期发生变化的时候,会使用$.get
来获取最新数据,而其余情况下则会使用缓存着的数据。虽然这么看着是没有什么问题,不过,当2/14日24点之后(2/15 0点之后),如果点开插件的话,此时获取到的数据就会一直使用到2/15日结束。那么问题来了,实际的情况是2/15日0点刚过的汇率其实和2/14日的汇率是相同的(也就是目标网站还没来得及更新数据),从而导致了数据同步不一致的问题,而这个错误的数据又会影响到与前一天的走势,从而失去了插件本身的意义。
于是,在思考了一天之后。我觉得采用类似于网站session
的方式来修复这个问题。在主逻辑中设置一个保存时间(目前先以半小时作为一个时间节点),一旦超过这一保存时间就重新获取一下数据。这样一来,既可以减少请求的次数,也可以做到数据及时的更新。
// 省略上面代码
chrome.storage.local.get('newData', function(data) {
// 第一次打开应用时,data.today 为 null 通过 ajax 获取当天汇率并设置
if (!data.newData) {
// console.log('new data');
dataRefresh(URL);
} else {
// 当存储的日期不是当天的时候,更新old,并更新汇率的箭头符号
if (data.newData.date != today) {
chrome.storage.local.set({
'oldData': data.newData
}, function() {
dataRefresh(URL);
});
} else {
var newData = data.newData;
var now = new Date().getTime();
// 为了兼容上一个版本的数据结构,如果不存在updateTime,就设置一个旧的日期,强制更新一次
var updateTime = newData.updateTime ? newData.updateTime : new Date(newData.date).getTime();
// 当大于session的时间时,重新获取数据,否则就使用储存的数据
if ((now - newData.updateTime) > REMAIN_TIME) {
dataRefresh(URL);
} else {
$('.rate-content').html(MSG.INFO_NEWRATE + ': <strong>' + newData.rate + '</strong>');
// 设置箭头图标以及对应的颜色
$('.arrow-icon').addClass(newData.arrowMark).addClass(newData.arrowColor).attr('data-content', newData.popMsg);
$('.arrow-icon').popover();
}
}
}
});
//省略后面代码
现在修改完之后的版本已经发布。可以通过各种神奇的方法从应用商店中下载到。
当然,这一次的修改也让我发现了又一个可以增加的点,就是设置的修改。类似于数据更新的间隔时间,不用像这么写死在逻辑中,让使用者可以自行设置。看来这个坑是要越挖越深了呢(原计划并没有这么多,都是一路迭代上来的。看来我的MemoryGame的重构又要延后了)。