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


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 相关文章推荐
js TextArea的选中区域处理
Dec 28 Javascript
JavaScript获取图片的原始尺寸以宽度为例
May 04 Javascript
一个仿糯米弹框效果demo
Jul 22 Javascript
常见的javascript跨域通信方法
Dec 31 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
Nov 03 Javascript
从parcel.js打包出错到选择nvm的全部过程
Jan 23 Javascript
使用FileReader API创建Vue文件阅读器组件
Apr 03 Javascript
使用Node搭建reactSSR服务端渲染架构
Aug 30 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
Mar 15 Javascript
Js和VUE实现跑马灯效果
May 25 Javascript
Node.js中出现未捕获异常的处理方法
Jun 29 Javascript
JS ES6异步解决方案
Apr 29 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数组内存耗用太多问题的解决方法
2010/04/05 PHP
用PHP的超级变量$_GET获取HTML表单(Form) 数据
2011/05/07 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
2014/11/05 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
php动态绑定变量的用法
2015/06/16 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
javascript引导程序
2008/10/26 Javascript
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
js点击出现悬浮窗效果不使用JQuery插件
2014/01/20 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
JavaScript实现音乐自动切换和轮播
2017/11/05 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
React Native 自定义下拉刷新上拉加载的列表的示例
2018/03/01 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
JavaScript实现简单计算器功能
2019/12/19 Javascript
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
在Python中操作文件之seek()方法的使用教程
2015/05/24 Python
分享一个简单的python读写文件脚本
2017/11/25 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
副校长竞聘演讲稿
2014/09/01 职场文书
小学安全教育主题班会
2015/08/12 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
java设计模式--七大原则详解
2021/07/21 Java/Android
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android