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


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 相关文章推荐
jQuery之end()和pushStack()使用介绍
Feb 07 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
Jun 14 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
Jun 22 Javascript
jQuery实现商品活动倒计时
Oct 16 Javascript
JQuery的attr 与 val区别
Jun 12 Javascript
JavaScript之RegExp_动力节点Java学院整理
Jun 29 Javascript
微信小程序 同步请求授权的详解
Aug 04 Javascript
js实现移动端轮播图效果
Dec 09 Javascript
JS实现移动端触屏拖拽功能
Jul 31 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
Nov 05 Javascript
加快Vue项目的开发速度的方法
Dec 12 Javascript
p5.js实现故宫橘猫赏秋图动画
Oct 23 Javascript
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小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
PHP输入流php://input介绍
2012/09/18 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
vue-dplayer 视频播放器实例代码
2019/11/08 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
[01:42]DOTA2 – 虚无之灵
2019/08/25 DOTA
python django 访问静态文件出现404或500错误
2017/01/20 Python
Python Subprocess模块原理及实例
2019/08/26 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
python实现横向拼接图片
2020/03/23 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
2014年人民调解工作总结
2014/12/08 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
商务司机岗位职责
2015/04/10 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
公司晚会主持词
2019/04/17 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python