【问题标题】:javascript setTimeout() is not working after few minutes and then it resolves without delayjavascript setTimeout() 几分钟后不起作用,然后立即解决
【发布时间】:2021-05-24 17:37:57
【问题描述】:

我为 60 秒的计时器编写了代码,但 setTimeout() 可以正常执行几分钟,但一段时间后它正在解析函数,但没有延迟,并且函数每秒都会被解析。

这里,this.rateCardTimerText 在第一次调用中初始化为零。

如果可用,请提供任何适当的解决方案,或者是否有任何替代方法可以实现它,然后请提及。

onChangeTimerChangeInfinity() {

    let no = Number(this.rateCardTimerText)

    if (no >= 100) {
        no = 0
        this.getCurrencyList()
    }
    else {
        no += 1.66
    }

    this.rateCardTimerText = no
    this.forceUpdate()
    setTimeout(this.onChangeTimerChangeInfinity.bind(this), 1000)
}

【问题讨论】:

    标签: javascript settimeout delay


    【解决方案1】:

    请改用setInterval()

    setInterval( () => onChangeTimerChangeInfinity, 1000);
    
    onChangeTimerChangeInfinity() {
    
        let no = Number(this.rateCardTimerText);
    
        if (no >= 100) {
            no = 0;
            this.getCurrencyList();
        }
        else {
            no += 1.66;
        }
    
        this.rateCardTimerText = no;
        this.forceUpdate();
    }
    

    【讨论】:

    • 在我看来,根据问题中的代码,间隔应该只在函数 onChangeTimerChangeInfinity 被调用后才开始。但是您的代码将在 1 秒后以任何方式启动 onChangeTimerChangeInfinity。我猜这不正确?
    • 是的,但在这种情况下,用户只需用 setInterval() 调用替换第一个调用。在此之后它是相同的,但没有用递归方法不必要地解决。
    【解决方案2】:

    确保在每次运行时清除之前的 setTimeout,如下所示:

    let intervalObj;
    
    onChangeTimerChangeInfinity() {
        clearTimeout(intervalObj)
        let no = Number(this.rateCardTimerText)
    
        if (no >= 100) {
            no = 0
            this.getCurrencyList()
        }
        else {
            no += 1.66
        }
    
        this.rateCardTimerText = no
        this.forceUpdate()
        intervalObj = setTimeout(this.onChangeTimerChangeInfinity.bind(this), 1000)
    }
    

    此外,就像上面的setInterval() 选项一样,您最终可能会导致代码自行跳闸,因为无论如何您都在强制这个东西每秒触发一次。如果getCurrencyList()forceUpdate()async,请考虑将第二个函数重写为promise,然后类似:

    let intervalObj;
    
    onChangeTimerChangeInfinity() {
        clearTimeout(intervalObj)
        doAsyncStuffInPromise().then( () => {
           intervalObj = setTimeout(this.onChangeTimerChangeInfinity.bind(this), 1000)
        })
        
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2016-01-28
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多