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


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 相关文章推荐
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
Jan 15 Javascript
JavaScript CSS修改学习第二章 样式
Feb 19 Javascript
jQuery源码分析之Event事件分析
Jun 07 Javascript
一次失败的jQuery优化尝试小结
Feb 06 Javascript
jquery checkbox实现单选小例
Nov 27 Javascript
JS简单实现点击复制链接的方法
Aug 03 Javascript
基于JavaScript Array数组方法(新手必看篇)
Aug 20 Javascript
Vue.js动态添加、删除选题的实例代码
Sep 30 Javascript
bootstrap轮播图示例代码分享
May 17 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
Sep 04 Javascript
基于复选框demo(分享)
Sep 27 Javascript
React学习之JSX与react事件实例分析
Jan 06 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读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
ionic实现滑动的三种方式
2016/08/27 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
快速搭建vue2.0+boostrap项目的方法
2018/04/09 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
2019/09/10 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
python中pickle模块浅析
2020/12/29 Python
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
班会关于环保演讲稿
2013/12/29 职场文书
餐饮营销方案
2014/02/23 职场文书
安全生产月宣传标语
2014/10/06 职场文书
2015年教师节广播稿
2015/08/19 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
Redis实战高并发之扣减库存项目
2022/04/14 Redis