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


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定时调用方法成功后并停止调用示例
Apr 08 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
May 20 Javascript
Javascript 函数parseInt()转换时出现bug问题
May 20 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
May 04 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
May 12 Javascript
怎么引入(调用)一个JS文件
May 26 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
Nov 25 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
Dec 17 Javascript
jQuery each和js forEach用法比较
Feb 27 jQuery
javascript之分片上传,断点续传的实际项目实现详解
Sep 05 Javascript
javascript利用键盘控制小方块的移动
Apr 20 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
Apr 26 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防止网站被攻击的应急代码
2015/10/21 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
基于JavaScript的操作系统你听说过吗?
2016/01/28 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
python学生管理系统代码实现
2020/04/05 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
基于opencv实现简单画板功能
2020/08/02 Python
从零实现一个自定义html5播放器的示例代码
2017/08/01 HTML / CSS
台湾生鲜宅配:大口市集
2017/10/14 全球购物
职业培训师职业生涯规划
2014/02/18 职场文书
统计岗位职责
2014/02/21 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
部门2014年度工作总结
2014/11/12 职场文书
承兑汇票延期证明
2015/06/23 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书