您当前方法的问题是setInterval
是异步的,return timeLeft
是立即执行的,而不是等待间隔结束.这就是为什么您在控制台日志(log)中看到undefined
的原因.此外,您当前的实现没有考虑retries
参数,该参数应该控制倒计时重复多少次.
要实现所需的功能,可以使用递归以及setTimeout
和setInterval
的组合.以下是您的方法的更新版本:
// Service file
// Countdown timer
public countdownTimer(retries, timeLeft) {
return new Promise(resolve => {
const countdown = () => {
let interval = setInterval(() => {
if (timeLeft > 0) {
console.log(timeLeft);
timeLeft--;
} else {
clearInterval(interval);
retries--;
if (retries > 0) {
timeLeft = 10;
countdown();
} else {
resolve();
}
}
}, 1000);
};
countdown();
});
}
// Component where I will be using the method
this.timeUtils.countdownTimer(4, 10).then(() => {
console.log('Countdown completed');
});
解释:
- 现在,
countdownTimer
方法返回一个Promise,该promise 在所有重试完成后解析.
countdown
函数处理从timeLeft
到0的单次倒计时,并在每次重试时递归调用.
setInterval
用于每秒倒计时.当timeLeft
达到0时,它会清除间隔并判断是否还有更多的重试.
- 如果剩下重试次数,它会将
timeLeft
重置为10,并再次呼叫countdown
.
- 一旦完成了所有重试,promise 就解决了,您就可以在组件的
.then()
方法中处理完成了.
此设置应提供所需的倒计时行为,并允许您有效地处理整个倒计时过程的完成.