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


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 相关文章推荐
jscript之Open an Excel Spreadsheet
Jun 13 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
Feb 05 Javascript
15个常用的jquery代码片段
Dec 19 Javascript
js 弹出虚拟键盘修改密码的简单实例
Oct 10 Javascript
微信小程序开发一键登录 获取session_key和openid实例
Nov 23 Javascript
node.js入门学习之url模块
Feb 25 Javascript
jQuery简单判断值是否存在于数组中的方法示例
Apr 17 jQuery
Vue 实现树形视图数据功能
May 07 Javascript
vue 路由嵌套高亮问题的解决方法
May 17 Javascript
详解webpack 最简打包结果分析
Feb 20 Javascript
Vue.js计算机属性computed和methods方法详解
Oct 12 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
Feb 27 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示例代码
2016/08/05 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
2016/11/05 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
Prototype Template对象 学习
2009/07/19 Javascript
javascript window对象属性整理
2009/10/24 Javascript
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
2011/09/20 Javascript
js取得url地址参数实例
2013/02/22 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
javascript学习指南之回调问题
2016/04/23 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
如何理解Python中的变量
2020/06/01 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
什么是SCM(软件配置管理)
2014/08/16 面试题
传播学毕业生求职信
2013/10/11 职场文书
20岁生日感言
2014/01/13 职场文书
食品销售计划书
2014/04/26 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
承兑汇票延期证明
2015/06/23 职场文书
SQL Server数据定义——模式与基本表操作
2021/04/05 SQL Server