0

可能不是最清晰的标题,但这里是 - 我需要在页面上显示两个独立的倒计时,接受用户输入的每个起始值。当一个到达零时,另一个启动并倒计时到零。代码如下,并按预期工作。

我调用 Timer1 函数,它检查变量的起始值,如果存在,则开始计数。当计数为零时,我清除间隔,将显示重置为起始值,并触发第二个计时器,如果它分配了一个值:

    function Timer1() {
        var gDuration = goTime;
        countdown = setInterval(function () {
            if (gDuration >= 0) {
                $("#durationValue").html(ToTime(gDuration));
                gDuration--;
            }
            else {
                clearInterval(countdown);
                $("#durationValue").html(ToTime(goTime));
                if (restTime != 0) {
                    Timer2();
                }
            }
        }, 1000);
    }

    function Timer2() {
        var rDuration = restTime;
        countdown = setInterval(function () {
            if (rDuration >= 0) {
                $("#restValue").html(ToTime(rDuration));
                rDuration--;
            }
            else {
                clearInterval(countdown);
                $("#restValue").html(ToTime(restTime));
            }
        }, 1000);
    }

下一步是允许该进程运行一定数量的循环 - 我尝试将 Timer1 中的 setInterval 包装在一个 for 循环中,但这是行不通的。任何想法如何更好地解决这个问题?

4

2 回答 2

1

for-loops 不适用于异步的东西。正如您已经演示过的那样,只需将其设为具有结束条件的计数器g/rDuration即可。

带有一些回调抽象和大量的延续传递风格:

function timer(el, duration, interval, callback) {
    var countdown = setInterval(function() {
        if (duration-- >= 0) {
            el.text(ToTime(duration));
        } else {
            clearInterval(countdown);
            callback();
        }
    }, interval);
}

var goTime = …, restTime = …;
function t1(cb) {
    timer($("#durationValue"), goTime, 1000, cb);
}
function t2(cb) {
    timer($("#restValue"), restTimer, 1000, cb);
}
var loops = …;
(function loop(cb) {
    t1(function(){
        t2(function() {
            if (loop-- >= 0)
                loop(cb);
            else
                cb();
        });
    });
})(function() {
    alert("finished!");
});
于 2012-12-21T03:38:35.070 回答
0

我能想到的最简单的事情是让你的 Timer 函数在当前迭代中有一个参数。每当一个计时器开始另一时间时,增加该值。并使用该值来确定它是否确实应该启动下一个计时器。

于 2012-12-21T03:37:03.387 回答