小程序实现订单倒计时功能


Posted in Javascript onApril 23, 2019

最近项目遇到了 一个小问题,当订单需要支付的时候,超过指定时间,自动关闭这个订单,未到达订单结束时间时,需要显示订单还有多久关闭, 如下图:

小程序实现订单倒计时功能

写出的这个方法支持多个对象,看到技术群有很多人问这个问题,而没有人回答,决定把这个解决方案贡献出来(不知道算不算好的解决方案)

我的解决方案是: 后台给出订单的结束时间,然后再去请求服务器当前的时间,互相转换成时间戳,然后相减 得出的结果是 xxx毫秒 然后 / 1000 就是真正的相差时间了。

JS文件

page({
 data: {
 
 },
 onLoad: function(){
 var that = this; // this 的指向性问题 需要在function 外保存
 wx.request({
  url: 'xxx',
  data: {xxx},
  success: function(result){
  that.setData({
   dataSourcesArray: result.data.order // 请求到的数据
  });
  /**
  * result.data.order 是 请求所有的订单信息
  * serviceTime 是封装的请求服务器 时间
  * 服务器的时间格式是 2018/08/01 17:35:08
  *
  * itemIndex 是防止列表 中的某一条数据已经被购买而导致修改数据时的错乱
  *
  */
  that.serviceTime(function (res) {
   // 服务器的时间戳
   var nowYear = res.data.serviceTime.split(' ')[0];
   var nowTime = new Date(res.data.serviceTime).getTime();
   // 这里传入只有未结束的订单
   var orderDetail = [];
   for (var i = 0; i < result.data.order.length; i++) { 
   // 如果订单未过期状态
   if (result.data.order[i].state == '待付款') {
    result.data.order[i].itemIndex = i; 
    orderDetail.push(result.data.order[i]);
   }
   }
   result.data.order = orderDetail;
   that.operation(result);// 待付款的订单传入这个方法内
  });
  }
 })
 },
 /*
 * 这里应该不要用setInterval 应该用 setTimeout 的 避免造成 网络阻塞
 */
 operation: function(result) { // 接收到没有结束的订单信息
 var that = this;
 time = setInterval(function () { // 循环执行
  that.serviceTime(function(res) {// 获取服务器时间
  that.resetState(res, result); // 设置未到结束时间订单的状态
  });
 }, 1000);
 },
 // 设置未结束订单的状态
 /*
 ** res 请求获取服务器的时间的结果集
 ** dataSourcesArray 是显示页面的订单信息
 */
 resetState: function(res, result) {
 var nowTime = new Date(res.data.serviceTime).getTime();// 当前时间的时间戳
 
 for (let i = 0; i < result.data.order.length; i++) { // 循环添加 倒计时
  var index = result.data.order[i].itemIndex;
  var status = "dataSourcesArray[" + index + "]." + 'state';
  var showTime = "dataSourcesArray[" + index + "]." + 'showTime';
  var futureTime = new Date(result.data.order[i].expiryTime).getTime();
  // 未来的时间减去现在的时间 ;
  var resTime = (futureTime - nowTime) / 1000;
  // 结束时间
  var zero = futureTime - nowTime;
  if (zero >= 0) { // 认为还没有到达结束的时间
  var timeSeconds = timestampToTime(resTime);
  this.setData({
   [showTime]: timeSeconds
  })
  } else { // 结束的时间已经到了
  result.data.order.splice(i, 1); // 该订单自动结束时间 从这个列表中删除 就不必老是循环他
  this.setData({
   [showTime]: "超过时间 订单已经关闭",
   [status]: "订单过期"
  });
  }
 
  if(result.data.order.length == 0){// 如果没有可支付订单 则停止这个订单
  clearInterval(time);
  }
 }
 },
 // 请求到系统时间 调取成功之后执行回调函数
 serviceTime: function (fn){
 wx.request({
  url: 'https://www.xxx.cn/getTime', // 仅为示例,并非真实的接口地址
  header: {
  'content-type': 'application/json' // 默认值
  },
  success(res) {
  fn && fn(res);
  }
 })
 }
})
 
// 时间转换
function timestampToTime(s) {
 var h = Math.floor(s / 3600 % 24);
 var min = Math.floor(s / 60) % 60;
 var sec = s % 60;
 h = add(h);
 min = add(min);
 sec = add(sec);
 return h + ':' + min + ':' + sec
}
 
// 添 0
function add(m) {
 return m < 10 ? '0' + m : m
}

wxml文件

<!-- 如果是待付款状态则会显示倒计时 -->
<view wx:for="{{dataSourcesArray}}" wx:for-item="item" wx:key="key">
 <view wx:if="{{item.state == '待付款'}}" class="showTime">
 <text class="title">剩余支付时间</text>
 <text class="content">{{item["showTime"]}}</text>
 </view>
</view>

最终效果图 如下(支持多个列表):

小程序实现订单倒计时功能

(当页面离开时,应该清除这个定时器,页面进来时也要触发!)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
9个JavaScript评级/投票插件
Jan 18 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
Mar 20 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
Jan 10 Javascript
基于jQuery实现中英文切换导航条效果
Sep 18 Javascript
JS实现动态增加和删除li标签行的实例代码
Oct 16 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
Dec 14 Javascript
Bootstrap table表格简单操作
Feb 07 Javascript
vuejs父子组件之间数据交互详解
Aug 09 Javascript
vue router 跳转后回到顶部的实例
Aug 31 Javascript
Angular实现svg和png图片下载实现
May 05 Javascript
javascript删除数组元素的七个方法示例
Sep 09 Javascript
用vite搭建vue3应用的实现方法
Feb 22 Vue.js
vue实现密码显示与隐藏按钮的自定义组件功能
Apr 23 #Javascript
使用Vue中 v-for循环列表控制按钮隐藏显示功能
Apr 23 #Javascript
vue缓存的keepalive页面刷新数据的方法
Apr 23 #Javascript
Vue 指令实现按钮级别权限管理功能
Apr 23 #Javascript
Vue 之孙组件向爷组件通信的实现
Apr 23 #Javascript
Vue infinite update loop的问题解决
Apr 23 #Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
Apr 23 #Javascript
You might like
PHP脚本数据库功能详解(下)
2006/10/09 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
2016/10/13 PHP
PHP基于GD库实现的生成图片缩略图函数示例
2017/07/05 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
js实现碰撞检测
2021/01/29 Javascript
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
python代码xml转txt实例
2020/03/10 Python
Python Spyder 调出缩进对齐线的操作
2021/02/26 Python
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
香港士多网上超级市场:Ztore
2021/01/09 全球购物
如何设置Java的运行环境
2013/04/05 面试题
跟单业务员岗位职责
2014/03/08 职场文书
水毁工程实施方案
2014/04/01 职场文书
网络技术专业求职信
2014/05/02 职场文书
商铺租房协议书范本
2014/12/04 职场文书
2015年学生会工作总结范文
2015/03/31 职场文书
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS