【问题标题】:Can we stop async function with a while inside?我们可以在一段时间内停止异步功能吗?
【发布时间】:2019-03-05 13:43:33
【问题描述】:

我是 Angular(和编码)的新手,我想知道一旦我在 html 中触发,是否可以在一段时间后(使用 setTimeout)开始向变量添加值,然后停止单击另一个按钮的过程。 这是html:

<div>
  <span>
    <button (click)="addingNumber(5000)">Start adding Number</button>
  </span>
  <span>
    <button (click)="stopAddingNumber()">Stop Adding Number</button>
  </span>
</div>
<div>{{actualNumber}}</div>

这是我正在尝试的 Ts:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-number-add',
  templateUrl: './number-add.component.html',
  styleUrls: ['./number-add.component.css']
})
export class NumberAdd implements OnInit {

  actualNumber = 0;
  countActive: boolean;

  constructor() { }

  ngOnInit() {
  }

  waitTime(awaitTime: number) {
    return new Promise(() => {
      setTimeout(() => {
        this.actualNumber += 1;
      }, awaitTime);
    });
  }

  async addingNumber(time: number) {
    this.countActive = true;
    while (this.countActive) {
      await this.waitTime(time);
    }
  }

  stopAddingNumber() {
    this.countActive = false;
  }
}

当我尝试这段代码时,它只会打印 1 并在此处“停止”。

【问题讨论】:

    标签: javascript angular async-await


    【解决方案1】:

    你不需要使用async/await 来做你想做的事情。使用setIntervalclearInterval 会给你想要的效果。

    actualNumber = 0;
    interval = null;
    
    addingNumber(time: number) {
        if (this.interval === null) {
            this.interval = setInterval(() => this.actualNumber++, time);
        }
    }
    
    stopAddingNumber() {
        if (this.interval !== null) {
            clearInterval(this.interval);
            this.interval = null;
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果我理解了您的问题,不如改用 setInterval 和 clearInterval。这是一个代码示例,我不确定它是否会正常运行。

      export class NumberAdd implements OnInit {
      
        actualNumber = 0;
        countActive: boolean;
        interval = null;
      
        constructor() { }
      
        ngOnInit() {
        }
      
        addingNumber(time: number) {
          if (interval) {
              clearInterval(interval);
              interval = null;
          }
      
          interval = setInterval(() {
              this.actualNumber += 1;
          }, time);
        }
      
        stopAddingNumber() {
          if (interval) {
              clearInterval(interval);
          }
      
          interval = null;
        }
      }
      

      【讨论】:

      • 效果很好,谢谢!搞砸了,以为我不得不放弃异步/等待路径。可以删除异步。
      • 这段代码有四个问题:1)interval不是类成员,而是var。 2)addingNumber不是async,不需要声明为async。 3) addingNumber 不检查间隔是否已经排队,允许额外的间隔排队,然后将无法清除。 4) stoppAddingNumber 不会将interval 设置为虚假状态,例如null
      • 是的,它有问题。代码已重新编辑,希望现在可以了
      猜你喜欢
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多