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


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 相关文章推荐
JavaScript多线程的实现方法
May 08 Javascript
HTML颜色选择器实现代码
Nov 23 Javascript
JS限制Textarea文本域字符个数的具体实现
Aug 02 Javascript
jQuery Password Validation密码验证
Dec 30 Javascript
微信小程序实现星星评价效果
Nov 02 Javascript
判断iOS、Android以及PC端的示例代码
Nov 15 Javascript
Vue.js的复用组件开发流程完整记录
Nov 29 Javascript
策略模式实现 Vue 动态表单验证的方法
Sep 16 Javascript
jquery向后台提交数组的代码分析
Feb 20 jQuery
vue 使用 canvas 实现手写电子签名
Mar 06 Javascript
深入浅析React中diff算法
May 19 Javascript
利用js实现简单开关灯代码
Nov 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 接口类与抽象类的实际作用
2009/11/26 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
JSON与XML优缺点对比分析
2015/07/17 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
vue中的 $slot 获取插槽的节点实例
2019/11/12 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
使用Python获取Linux系统的各种信息
2014/07/10 Python
python使用电子邮件模块smtplib的方法
2016/08/28 Python
python操作列表的函数使用代码详解
2017/12/28 Python
Python yield与实现方法代码分析
2018/02/06 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
国际贸易毕业生自荐书
2014/06/22 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
MongoDB支持的索引类型
2022/04/11 MongoDB
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android