我正在try 创建一个倒计时计时器,它从10秒开始,每秒钟倒计时一次,直到0.一旦发生这种情况,它应该从10秒重新开始,并倒计时到0.这种情况总共应该发生4次.我还想使用该方法中的一个返回来实现这一点.

这就是我try 的方法,我在控制台日志(log)中得到了一个未定义的结果,而且也不确定重试是否应该只是围绕此方法的For循环

Service file

  //Countdown timer
  public countdownTimer(retries, timeLeft) {
     setInterval(() => {
      if(timeLeft > 0) {
        timeLeft--;
      } else {
        timeLeft = 10;
      }
    }, 1000);
    return timeLeft;
  }

组件,我将在其中使用该方法

console.log(this.timeUtils.countdownTimer(4, 10));

有谁能帮忙吗?

推荐答案

您当前方法的问题是setInterval是异步的,return timeLeft是立即执行的,而不是等待间隔结束.这就是为什么您在控制台日志(log)中看到undefined的原因.此外,您当前的实现没有考虑retries参数,该参数应该控制倒计时重复多少次.

要实现所需的功能,可以使用递归以及setTimeoutsetInterval的组合.以下是您的方法的更新版本:

// 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');
});

解释:

  1. 现在,countdownTimer方法返回一个Promise,该promise 在所有重试完成后解析.
  2. countdown函数处理从timeLeft到0的单次倒计时,并在每次重试时递归调用.
  3. setInterval用于每秒倒计时.当timeLeft达到0时,它会清除间隔并判断是否还有更多的重试.
  4. 如果剩下重试次数,它会将timeLeft重置为10,并再次呼叫countdown.
  5. 一旦完成了所有重试,promise 就解决了,您就可以在组件的.then()方法中处理完成了.

此设置应提供所需的倒计时行为,并允许您有效地处理整个倒计时过程的完成.

Angular相关问答推荐

将Angular 17中的http服务与独立组件一起使用

Angular 升级到v16和Ant设计错误:';nzComponentParams';类型';ModalOptions';中不存在

截取提取后端S获取添加授权头的请求

NGNEW不会在src根文件夹ANGLI CLI 17.0.10中生成app.mode.ts

Angular 17多内容投影错误

Angular NG5002错误无效的ICU消息和意外字符EOF

在ngOninit方法中直接VS初始化属性

Angular 13 Sass 模块无法在编译中正确导入文件

Angular 13 - 何时创建嵌入式视图?

Angular 无法从后端获取数据到前端

Angular2 Material Dialog css,对话框大小

如何以像素为单位将属性绑定到 style.width?

无法获得 angular-material md-sidenav 的 100% 高度

来自 ngFor 项的动态 routerLink 值给出错误Got interpolation ({{}}) where expression was expected

如何在 Angular CLI 1.1.1 版中将路由模块添加到现有模块?

如何提高 Angular2 应用程序的加载性能?

为什么 *ngIf 不适用于 ng-template?

测试一个包含 setTimeout() 的函数

ng build 时超出调用重试次数异常

如何对 *ngFor 应用数量限制?