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


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 相关文章推荐
jquery isEmptyObject判断是否为空对象的函数
Feb 14 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
Dec 29 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
Jan 23 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
Aug 02 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
Jun 12 Javascript
JS实现FLASH幻灯片图片切换效果的方法
Mar 04 Javascript
jQuery代码性能优化的10种方法
Jun 21 Javascript
AngularJS模块详解及示例代码
Aug 17 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
Jul 13 Javascript
微信小程序使用component自定义toast弹窗效果
Nov 27 Javascript
js回调函数原理与用法案例分析
Mar 04 Javascript
Vue使用鼠标在Canvas上绘制矩形
Dec 24 Vue.js
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缓存类代码
2015/10/23 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
使用jquery实现简单的ajax
2013/07/08 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
基于zepto.js实现登录界面
2017/10/09 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
python获取android设备的GPS信息脚本分享
2015/03/06 Python
python计算时间差的方法
2015/05/20 Python
Python的Django框架中的Context使用
2015/07/15 Python
python数据结构之链表详解
2017/09/12 Python
python批量获取html内body内容的实例
2019/01/02 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
CSS3过渡transition效果实例介绍
2016/05/03 HTML / CSS
苹果美国官方商城:Apple美国
2016/08/24 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
医学生个人求职信范文
2013/09/24 职场文书
全陪导游欢迎词
2014/01/17 职场文书
实习老师离校感言
2014/02/03 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
goland设置颜色和字体的操作
2021/05/05 Golang
background-position百分比原理详解
2021/05/08 HTML / CSS
MySql开发之自动同步表结构
2021/05/28 MySQL