微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在这种情况下我能做什么? setinterval 倒数计时器内的 setinterval

如何解决在这种情况下我能做什么? setinterval 倒数计时器内的 setinterval

我需要在 setInterval 中使用倒计时的帮助或想法。

这是我在 js 上的倒数计时器(很明显):

function startTimer(duration) {
    var timer = duration,minutes,seconds;
    setInterval(function () {
        minutes = parseInt(timer / 60,10);
        seconds = parseInt(timer % 60,10);

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        document.getElementById('minuteDrag').innerText = minutes;
        document.getElementById('secondDrag').innerText = seconds;

        if (--timer < 0) {
            timer = duration;
        }
    },1000);
}

当我在第二个 setinterval 之外调用这个函数时,它完美地工作(正如预期的那样)。 但是当我尝试在下面的代码中运行这个函数时,时间倒计时的函数被窃听了,我猜是因为倒数计时器在另一个 setinterval 中被调用

这里有解决方案的任何想法吗? (我无法退出“主设置间隔”)。

var api = new Lolesports_API();

api.get_event_details('pt-BR','105562529627228920')
.then(result_games => {         
        var game_id
        result_games.event.match.games.forEach(game => game_id = game.id)
        api.get_teams('pt-BR')
        .then(result_teams =>{
            var teams_dict = {}
            result_teams.teams.forEach(team => {teams_dict[team.id] = team.code})
            setInterval(function(){
                api.get_window(game_id,get_lastest_date())
                .then(result_window => {                
                    var last_frame = result_window.frames[result_window.frames.length - 1];
                    var game_state = last_frame.gameState;
                    startTimer(60*5)
                    if (game_state == 'in_game') {
                        document.getElementById("gameState").style.backgroundColor = '#33cc33';
                        stopwatch_game.start();
                    } else if (game_state == 'paused') {
                        document.getElementById("gameState").style.backgroundColor = '#66a3ff';
                        stopwatch_game.pause();
                    } else {
                        document.getElementById("gameState").style.backgroundColor = '#ff8080';
                        stopwatch_game.pause();                  
                    }
                    //stopwatch_game.start();

                })
            },500)
        })
})

PS:这不是完整的代码,为了不污染问题,我删除了很大一部分。

解决方法

现在您每半秒开始一个新的倒计时间隔。

为什么不从 startTimer 中的 setInterval 返回值,以便外循环可以根据需要停止它?

例如

startTimer = (duration) => {
    let timer = duration,minutes,seconds;
    return setInterval(function () {
        minutes = parseInt(timer / 60,10);
        seconds = parseInt(timer % 60,10);

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        document.getElementById('minuteDrag').innerText = minutes;
        document.getElementById('secondDrag').innerText = seconds;

        if (--timer < 0) {
            timer = duration;
        }
    },1000);
}

然后在你的主循环中你可以使用 clearInterval 来停止计时器......或者至少检查它是否存在:

let foo = undefined;
if (foo === undefined) {
  foo = startTimer(60*5);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。