小程序中设置缓存过期的实现方法


Posted in Javascript onJanuary 14, 2020

需求是两张图片在这个时间段内交替显示,当天只弹一次图片。

后端返回的数据格式:

{
  "start": "2019/10/08 00:00:00",
  "end": "2019/10/30 23:59:59",
  "ads": [
    {
      "image": "xxxx",
      "uri": "wechat:zhizhuxy666"
    },
    {
      "image": "xxx",
      "uri": "wechat:zhizhuxy666"
    }
  ]
}

小程序中缓存没有过期时间,也就是说存储进去的缓存要自己手动清除,那么如何保证两张图片能够交替显示呢?

需求分析

  1. 一天只弹一次广告
  2. 图片轮流显示
  3. 只在时间范围内显示

这里有个关键是,如何知道时间有没有到第二天?

思路

需要用到两个缓存:

  1. showAdvert:用于检测弹窗时间是否在有效期内
  2. showAdvert${currentDay}:用于检测当天是否弹过弹窗

为什么要用到两个?

因为这里有两个状态检测:一个是否在有效期内,一个是当天是否弹过弹窗。

如何判断时间有没有到第二天?

将所有天数的时间戳加上一天保存起来(ps:这个方法很蠢)。然后每次进入小程序都获取下当前的时间,对比下当天的时间是否大于保存的时间戳。如果超过就说明已经到了第二天。

为什么要加上一天?

因为后端返的开始时间是当天的凌晨,而真正要过完这一天是24点之后。一天的毫秒数:24 * 60 * 60 * 1000。

代码实现

变量的声明

声明需要使用的时间戳

const startTempStamp = new Date(item.start).getTime()    
const endTempStamp = new Date(item.end).getTime()
const oneDayTempStamp = 24 * 60 * 60 * 1000   // 一天的时间戳
const now = (new Date('2019/09/28 00:00:01')).getTime()

声明需要一共多少天,以及当天是第几天;这里使用Math.ceil()向上取整

const allDay = Math.ceil((endTempStamp - startTempStamp) / oneDayTempStamp)
const currentDay = Math.ceil((now - startTempStamp) / oneDayTempStamp)

判断当前时间是否在时间有效期内内,如果在时间有效期内,就弹弹窗,如果不在就不弹

if (now > startTempStamp && now < endTempStamp) {
  ... //下面弹窗逻辑的实现
}else {
  this.setData!({showAdvert: false})
  wx.setStorageSync('showAdvert', false) 
}

接下来开始写弹出弹窗的逻辑。

弹窗逻辑的实现

首先判断当天的时间戳是否大于前一天的时间戳,如果大于就说明到第二天了,如果小于说明今天还没有过去。

然后清除前一天的缓存

const table = []
for (let i = 1; i <= allDay; i++) {
  table.push(startTempStamp + oneDayTempStamp * i)
}
if (now > table[currentDay - 2]) {
  wx.removeStorageSync(`showAdvert${table[currentDay - 2]}`)
}

图片交替显示

let n = 0
if (currentDay % item.ads.length === 0) {
  n = 1
} else if (currentDay % item.ads.length === 1) {
  n = 0
}

检查当天广告是否弹出过

const advert = wx.getStorageSync(`showAdvert${table[currentDay - 1]}`) || false    
if (!advert) {
  this.setData!({showAdvert: true})
  wx.setStorageSync('showAdvert', true)
}

弹出广告,并设置缓存

const timeStamp = Math.floor(new Date().getTime() / 10000).toString()
this.setData!({
  advertLink: item.ads[n].image + `?timeStamp=${timeStamp}`,
  copyWechat: item.ads[n].uri,
}, () => {
  wx.setStorageSync(`showAdvert${table[currentDay - 1]}`, true)
})

一进入页面读下本地缓存,是否要弹出弹窗。

onShow(){
  const showAdvert = wx.getStorageSync('showAdvert')
  this.setData!({showAdvert})
}

总结

这里最大的问题是如何判断当前的时间有没有过24点,自己一直没有想到比较好的解决方法,限于自己的水平,没有更好的方案,这里我只是记录下实现的过程,不喜勿喷,如果有更好的方案,欢迎指点。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
疯狂Jquery第一天(Jquery学习笔记)
May 11 Javascript
JavaScript通过RegExp实现客户端验证处理程序
May 07 Javascript
Javascript异步编程模型Promise模式详细介绍
May 08 Javascript
js实现的下拉框二级联动效果
Apr 30 Javascript
浅谈EasyUI常用控件的禁用方法
Nov 09 Javascript
flexslider.js实现移动端轮播
Feb 05 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
Sep 07 Javascript
js中位运算的运用实例分析
Dec 11 Javascript
少女风vue组件库的制作全过程
May 15 Javascript
k8s node节点重新加入master集群的实现
Feb 22 Javascript
微信小程序用户授权最佳实践指南
May 08 Javascript
ES6实现图片切换特效代码
Jan 14 #Javascript
vue项目创建步骤及路由router
Jan 14 #Javascript
JS实现容器模块左右拖动效果
Jan 14 #Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
Jan 14 #Javascript
vue页面加载时的进度条功能(实例代码)
Jan 13 #Javascript
微信小程序canvas截取任意形状的实现代码
Jan 13 #Javascript
js实现列表向上无限滚动
Jan 13 #Javascript
You might like
php面向对象的方法重载两种版本比较
2008/09/08 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
PHP如何将XML转成数组
2016/04/04 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
Jacques Lemans德国:奥地利钟表品牌
2019/12/26 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
主持人婚宴答谢词
2014/01/28 职场文书
生日主持词
2014/03/20 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server