美文网首页
全栈sport项目之前台遇到的那些坑儿(二)

全栈sport项目之前台遇到的那些坑儿(二)

作者: 宝妞儿 | 来源:发表于2019-10-31 11:25 被阅读0次

因为项目也还在不断的敲代码中,所以该系列文章也会持续更新!
项目链接地址: sport项目

1、前端计时器的实现?

前端时间计数,就像手机的计时器一样,点击开始,时间依次增加1s,可以重置定时器。页面显示要求为 这样的格式: ' 00: 00 : 02 ' 这样的形式。如何实现呢?

刚开始没啥思路,然后网上也搜了相应的例子,但是执行的有问题,

正确的转化成时分秒的代码如下:

//util.js
export function formateRunTime(time) {
   let hour = parseInt(time/3600000%24,10);
   let minute = parseInt(time/60000%60,10);
   let seconds = parseInt(time/1000%60,10);
   hour = hour >= 10 ? hour : `0${hour}`;
   minute = minute >= 10 ? minute : `0${minute}`;
   seconds = seconds >= 10 ? seconds : `0${seconds}`;
   return `${hour} : ${minute} : ${seconds}`;
}

错误的代码定时器如下:

import { formateRunTime } from './utils.js';
onStart() { //k开始计时
  let time = new Date().getTime();
  this.startTimer = setInterval(() => {
     let nowTime = new Date().getTime();
     let value = nowTime - time;
    let consumeTime = formateRunTime(value);
    this.setState({ consumeTime });
 },1000);
}

onStop() {
  clearInterval(this.startTimer);
}

如上,错误的代码就在定时器执行这里。这里由于js是单线程运行的,所以碰到定时器之类的宏任务时,把它放在任务队列里,等到有空了再去任务队列中取出执行。

所以,本身我们想的是,每隔1s会执行计算,然后依次打印出: 00:00:01,00:00:02 ...

但根据实际情况打印,最开始竟然延迟了3s-4s才执行,而且这个延迟执行的时间还不确定。所以打印出来的就是00:00:03,00:00:04 ...

显然不满足要求!后来脑筋一转,每次计时都会增加1000ms,即设定一个初始的时间为0,每1s循坏执行累加就可以啦,所以正确的代码如下:

//这里省略了部分代码
constructor(props){
   this.state = { consumeTime : '' },
   this.tempTime = 0;
   this.startTimer = null;

}

//计时
countDown() {
  this.tempTime +=1000;**
  const consumeTime = formateRunTime(this.tempTime);**
  this.setState({ consumeTime})**
}

onStart() {
  this.startTimer = setInterval(() => {
     this.countDown();
   },1000);
}

onStop(){
 clearInterval(this.startTimer)
}

相关文章

网友评论

      本文标题:全栈sport项目之前台遇到的那些坑儿(二)

      本文链接:https://www.haomeiwen.com/subject/swgzvctx.html