计数器在 setInterval 循环中不断重置为声明的变量
Counter keeps resetting to declared variable on setInterval loop
我正在尝试使用 setInterval 显示一个每秒上升的计时器。
变量似乎在每个循环中都会自行重置;结果是 HTML 页面上的显示没有改变。
我已经将变量移到了函数之外,但这不起作用。不太确定从这里去哪里。
this.intervalFour = setInterval(() => this.totalTime(this.secs, this.restSecs), 1000);
totalTime(seconds, rests) {
var fullTime = seconds * 8 + rests * 7;
fullTime--;
var secCounter: any = 0;
var minCounter: any = 0;
secCounter++;
if (secCounter < 10) {
secCounter = "0" + secCounter;
}
if (minCounter < 10) {
minCounter = "0" + minCounter;
}
if (secCounter == 60) {
secCounter = 0;
minCounter++;
}
if (fullTime = 0) {
clearInterval(this.intervalFour);
}
this.m.innerHTML = minCounter;
this.s.innerHTML = secCounter;
console.log(secCounter, minCounter, "test");
}
我知道坚持下去是一件愚蠢的事情,但我找不到让 secCounter 在每个循环中增加一的解决方案。
我不确定它是否正确,因为这里没有完整的代码,但我认为 setInterval 回调函数中的 'this' 关键字有问题。
setInterval 回调中的 'this' 绑定到全局 'this',在本例中为 Window 对象。
所以,您需要像这样指定 'this' 对象。
const self = this;
self.secs = initSecs;
self.restSecs = initRestSecs;
self.totalTime = function totalTime() { ... };
setInterval(() => self.totalTime(self.secs, self.restSecs), 1000);
您可以尝试以下方法。
虽然我没有一定的价值所以我注释了那段代码,你可以根据需要取消注释那段代码:
<script type="text/javascript">
var secs = 10;
var restSecs = 10;
var secCounter = 0;
var minCounter = 0;
this.intervalFour = setInterval(() => this.totalTime(this.secs, this.restSecs), 1000);
function totalTime(seconds, rests) {
var fullTime = seconds * 8 + rests * 7;
fullTime--;
this.secCounter++;
if (this.secCounter < 10) {
this.secCounter = "0" + this.secCounter;
}
if (this.minCounter < 10) {
this.minCounter = "0" + this.minCounter;
}
if (this.secCounter == 60) {
this.secCounter = 0;
this.minCounter++;
}
// if (fullTime = 0) {
// clearInterval(this.intervalFour);
// }
console.log("this.minCounter" , this.minCounter);
console.log("this.secCounter" , this.secCounter);
// this.m.innerHTML = this.minCounter;
// this.s.innerHTML = this.secCounter;
console.log(this.secCounter, this.minCounter, "test");
}
在这个解决方案中,秒数每秒都在完美增加。
如果您希望显示某种计时器,这可能会有所帮助。
const displayTime = (ticks) => {
const seconds = parseInt(ticks % 60);
let minute = parseInt(ticks / 60);
const hour = parseInt(minute / 60);
if (hour > 0) {
minute = parseInt(minute % 60);
}
console.log([hour, minute, seconds].join(':'));
};
const tick = 0;
setInterval(()=> displayTime(tick++), 1000);
我正在尝试使用 setInterval 显示一个每秒上升的计时器。
变量似乎在每个循环中都会自行重置;结果是 HTML 页面上的显示没有改变。
我已经将变量移到了函数之外,但这不起作用。不太确定从这里去哪里。
this.intervalFour = setInterval(() => this.totalTime(this.secs, this.restSecs), 1000);
totalTime(seconds, rests) {
var fullTime = seconds * 8 + rests * 7;
fullTime--;
var secCounter: any = 0;
var minCounter: any = 0;
secCounter++;
if (secCounter < 10) {
secCounter = "0" + secCounter;
}
if (minCounter < 10) {
minCounter = "0" + minCounter;
}
if (secCounter == 60) {
secCounter = 0;
minCounter++;
}
if (fullTime = 0) {
clearInterval(this.intervalFour);
}
this.m.innerHTML = minCounter;
this.s.innerHTML = secCounter;
console.log(secCounter, minCounter, "test");
}
我知道坚持下去是一件愚蠢的事情,但我找不到让 secCounter 在每个循环中增加一的解决方案。
我不确定它是否正确,因为这里没有完整的代码,但我认为 setInterval 回调函数中的 'this' 关键字有问题。
setInterval 回调中的'this' 绑定到全局 'this',在本例中为 Window 对象。
所以,您需要像这样指定 'this' 对象。
const self = this;
self.secs = initSecs;
self.restSecs = initRestSecs;
self.totalTime = function totalTime() { ... };
setInterval(() => self.totalTime(self.secs, self.restSecs), 1000);
您可以尝试以下方法。
虽然我没有一定的价值所以我注释了那段代码,你可以根据需要取消注释那段代码:
<script type="text/javascript">
var secs = 10;
var restSecs = 10;
var secCounter = 0;
var minCounter = 0;
this.intervalFour = setInterval(() => this.totalTime(this.secs, this.restSecs), 1000);
function totalTime(seconds, rests) {
var fullTime = seconds * 8 + rests * 7;
fullTime--;
this.secCounter++;
if (this.secCounter < 10) {
this.secCounter = "0" + this.secCounter;
}
if (this.minCounter < 10) {
this.minCounter = "0" + this.minCounter;
}
if (this.secCounter == 60) {
this.secCounter = 0;
this.minCounter++;
}
// if (fullTime = 0) {
// clearInterval(this.intervalFour);
// }
console.log("this.minCounter" , this.minCounter);
console.log("this.secCounter" , this.secCounter);
// this.m.innerHTML = this.minCounter;
// this.s.innerHTML = this.secCounter;
console.log(this.secCounter, this.minCounter, "test");
}
在这个解决方案中,秒数每秒都在完美增加。
如果您希望显示某种计时器,这可能会有所帮助。
const displayTime = (ticks) => {
const seconds = parseInt(ticks % 60);
let minute = parseInt(ticks / 60);
const hour = parseInt(minute / 60);
if (hour > 0) {
minute = parseInt(minute % 60);
}
console.log([hour, minute, seconds].join(':'));
};
const tick = 0;
setInterval(()=> displayTime(tick++), 1000);