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


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 相关文章推荐
Google Map Api和GOOGLE Search Api整合实现代码
Jul 18 Javascript
JavaScript Perfection kill 测试及答案
Mar 23 Javascript
深入理解javascript动态插入技术
Nov 12 Javascript
JavaScript匿名函数用法分析
Feb 13 Javascript
详解JavaScript中数组的相关知识
Jul 29 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
Mar 29 Javascript
AngularJS中过滤器的使用与自定义实例代码
Sep 17 Javascript
vue 的点击事件获取当前点击的元素方法
Sep 15 Javascript
vue组件通信传值操作示例
Jan 08 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
Apr 23 Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
Oct 09 Javascript
JavaScript函数柯里化
Nov 07 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防止直接访问.php 文件的实现方法
2017/07/28 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
让新消息在网页标题闪烁提示的jQuery代码
2013/11/04 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
2015/08/11 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
详解vue挂载到dom上会发生什么
2019/01/20 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
python实现多人聊天室
2020/03/31 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
贷款担保申请书
2014/05/20 职场文书
2014年感恩母亲演讲稿
2014/05/27 职场文书
奶茶店创业计划书
2014/08/14 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
企业与个人合作经营协议书
2014/11/01 职场文书
工作检讨书范文
2015/01/23 职场文书
2015年先进个人自荐书
2015/03/24 职场文书