setInterval只工作一次,然后停止

时间:2014-04-26 14:44:41

标签: javascript jquery

我创建了一个倒计时功能,但它只是在开始时起作用然后停止。

var rek_inter = setInterval(cnt(s_, d), 1000);    

function cnt(deg, deg2) {
    deg--;
    while (deg < 0) {
        deg = 59;
        deg2--;
    }
    if (deg2 < 0) {
        $('#s_').html("ok");
    } else if (deg2 >= 0) {
        var d_sn = fixd(deg2);
        var s_sn = fixd(deg);
        $('#s_').html(d_sn + ":" + s_sn);
    }
}

function fixd(g) {
    if (g < 10) {
        return '0' + g;
    }
    return g;
}

我也试过了;

var rek_inter = setInterval(function() {cnt(s_, d);}, 1000);

但结果是一样的。

如果我将函数放入区间函数中:

    var rek_inter = setInterval(function () {

        s_--;
        while (s_ < 0) {
            s_ = 59;
            d--;
        }
        if (d < 0) {
            $('#s_').html("ok");
        } else if (d >= 0) {
            var d_sn = fixd(d);
            var s_sn = fixd(s_);
            $('#s_').html(d_sn + ":" + s_sn);
        }
    }, 1000);

    function fixd(g) {
        if (g < 10) {
            return '0' + g;
        }
        return g;
    }

有效。但是我需要这样,因为我首先在顶部写道。这可能是什么问题和解决方案?

2 个答案:

答案 0 :(得分:2)

第一次尝试与:

相同
setInterval ( value, time) ;

这里是value = cnt(s_, d),是cnt函数调用的结果 这不起作用,因为setInterval需要一个函数。太糟糕了,它在javascript中无声地失败。

在第二次尝试中,问题是你只修改了函数var,所以不会发生任何变化:你改变了deg,deg2,实际上你想改变s_和d。

第三次尝试是正确的,因为你们都调用了一个函数并改变了全局变量s_和d。 我宁愿这样写:

var rek_inter = setInterval( iterate , 1000);

function iterate () {
    s_--;
    while (s_ < 0) {
        s_ = 59;
        d--;
    }
    if (d < 0) {
        $('#s_').html("ok");
    } else if (d >= 0) {
        var d_sn = fixd(d);
        var s_sn = fixd(s_);
        $('#s_').html(d_sn + ":" + s_sn);
    }
}

编辑: O.P.提到他想要处理一组(s_,d)参数 我建议你创建一个包含这些参数的对象数组:

 var sdParameters = [];
 sdParameters.push( { s : some value , d: some other value} );
 sdParameters.push( { s : some value 2, d: some other value 2 } );
 ... // (or using a for loop to grab the ds and ss if possible) 

然后在每个s / d对象由其索引定义之后,使用:

function iterate (ind) {
    var s_ = --sdParameters[ind].s ;       
    while (s_ < 0) {
        s_ = 59;
        sdParameters[ind].d--;
    }
    var d = sdParameters[ind].d;
    if (d < 0) {
        $('#s_').html("ok");
    } else if (d >= 0) {
        var d_sn = fixd(d);
        var s_sn = fixd(s_);
        $('#s_').html(d_sn + ":" + s_sn);
    }
}

您可以在一个全局数组上运行所有间隔:

     var rek_inter = setInterval( iterate.bind(null,0) , 1000);
     var rek_inter1 = setInterval( iterate.bind(null,1) , 1000);

(显然你可以/应该将间隔存储在一个数组中,你可以将它们存储在sdParameters中。

最后一句话:我无法使用相关的变量名称,因为我无法猜测其用途。当事情变得更复杂时,在代码中使用重要名称会有很大帮助。

答案 1 :(得分:2)

“我有很多s_,s_2,s_3 ......和d,d1,d2 ......值,我想在单个setInterval中使用它们,这就是我尝试使用cnt(s_,d)的原因);如果那样可行,我会写cnt(s_2,d2),cnt(s_3,d3)..“

你可以在这里使用闭包。

var rek_inter1 = setInterval(cnt(s_2, d2), 1000),
    rek_inter2 = setInterval(cnt(s_3, d3), 1000);

function cnt(deg, deg2) {
    return function () {
        deg--;
        while (deg < 0) {
            deg = 59;
            deg2--;
        }
        if (deg2 < 0) {
            $('#s_').html("ok");
        } else if (deg2 >= 0) {
            var d_sn = fixd(deg2);
            var s_sn = fixd(deg);
            $('#s_').html(d_sn + ":" + s_sn);
        }
    };
}