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


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 相关文章推荐
javascript中巧用“闭包”实现程序的暂停执行功能
Apr 04 Javascript
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
Apr 21 Javascript
JS 控件事件小结
Oct 31 Javascript
jquery的父子兄弟节点查找示例代码
Mar 03 Javascript
js实现的点击数量加一可操作数据库
May 09 Javascript
解读Bootstrap v4 sass设计
May 29 Javascript
JavaScript如何实现跨域请求
Aug 05 Javascript
js表单登陆验证示例
Oct 19 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
Jan 18 Javascript
ES6新特性之解构、参数、模块和记号用法示例
Apr 01 Javascript
iview日期控件,双向绑定日期格式的方法
Mar 15 Javascript
jQuery常见的遍历DOM操作详解
Sep 05 jQuery
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简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
javascript实现了照片拖拽点击置顶的照片墙代码
2015/04/03 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
js面向对象编程总结
2017/02/16 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
javascript+HTML5 canvas绘制时钟功能示例
2019/05/15 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
wxPython框架类和面板类的使用实例
2014/09/28 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
Numpy之reshape()使用详解
2019/12/26 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
Python如何实现单例模式
2016/06/03 面试题
销售人员中英文自荐信
2013/09/22 职场文书
家长对小学生的评语
2014/01/28 职场文书
《去年的树》教学反思
2014/04/11 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
体育节口号
2014/06/19 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
个人承诺书格式范文
2015/04/29 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
PyTorch 如何检查模型梯度是否可导
2021/06/05 Python
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android