如何创建一个简单的setTimeout循环

15

我只需要创建一个无限循环,涉及到一个元素的3个变化。这是我目前的代码:

    var count = 1;
    setTimeout(transition, 2000);

    function transition() {

        if(count == 1) {
            $('#ele').html('variation 2');
            var count = 2;

        } else if(count == 2) {
            $('#ele').html('variation 3');
            var count = 3;

        } else if(count == 3) {
            $('#ele').html('variation 1');
            var count = 1;
        }

        setTimeout(transition, 2000);

    }
7个回答

20

试试这个:

var count = 1;

function transition() {

    if(count == 1) {
        $('#ele').html('variation 2');
         count = 2;

    } else if(count == 2) {
        $('#ele').html('variation 3');
         count = 3;

    } else if(count == 3) {
        $('#ele').html('variation 1');
        count = 1;
    }

}
setInterval(transition, 2000);

14

如果您想要一个无限循环,应该使用setInterval()。这将运行一个无限循环,每次运行下一个变化:

var i=0;

setInterval(function() {
    switch(i++%3) {
        case 0: alert("variation 1");
        break;
        case 1: alert("variation 2");
        break;
        case 2: alert("variation 3");
        break;
    }

}, 2000);

如果你之后决定停止重复的代码,请在设置间隔时存储返回值并清除它:

var intervalId = setInterval(function() {
    ...
}, 1000);

clearInterval(intervalId);

3

这是最佳解决方案:

clearTimeout() 方法可以清除使用 setTimeout() 方法设置的定时器。

(function(){
    var timer, count=1;
    function transition(){
        clearTimeout(timer);

        switch(count){
            case 1: count = 2; break;
            case 2: count = 3; break;
            case 3: count = 1; break;
        }

        $('#ele').html('variation ' + count);

        timer = setTimeout(transition, 2000);
    }
    transition();
})();

0

在现实工作中,我最好的方法是“忘记基本循环”,而是使用包括“setInterval”和“setTimeOut”的组合:

    function iAsk(lvl){
        var i=0;
        var intr =setInterval(function(){ // start the loop 
            i++; // increment it
            if(i>lvl){ // check if the end round reached.
                clearInterval(intr);
                return;
            }
            setTimeout(function(){
                $(".imag").prop("src",pPng); // do first bla bla bla after 50 millisecond
            },50);
            setTimeout(function(){
                 // do another bla bla bla after 100 millisecond.
                seq[i-1]=(Math.ceil(Math.random()*4)).toString();
                $("#hh").after('<br>'+i + ' : rand= '+(Math.ceil(Math.random()*4)).toString()+' > '+seq[i-1]);
                $("#d"+seq[i-1]).prop("src",pGif);
                var d =document.getElementById('aud');
                d.play();                   
            },100);
            setTimeout(function(){
                // keep adding bla bla bla till you done :)
                $("#d"+seq[i-1]).prop("src",pPng);
            },900);
        },1000); // loop waiting time must be >= 900 (biggest timeOut for inside actions)
    }

注意(setTimeout)的真实行为:它们都会在同一时间开始计时,“三个bla bla bla将同时开始倒计时”,因此需要设置不同的超时时间来安排执行。

PS 2:这是一个定时循环的示例,但对于反应循环,您可以使用事件、Promise、async/await等。


0
如果你仍然想使用 setTimeoutclearTimeout 来创建一个循环,你应该使用类似于以下结构的循环。
var count = 1;
var timer = setTimeout( function(){
    transaction();
} , 2000);

function transition() {

    if(count == 1) {
        $('#ele').html('variation 2');
        count = 2;

    } else if(count == 2) {
        $('#ele').html('variation 3');
        count = 3;

    } else if(count == 3) {
        $('#ele').html('variation 1');
        count = 1;
    }
    //if(condition for continue) 
    setTimeout(transition, 2000);
    //else if you want to stop the loop
    //clearTimeout(timer, 2000);
}

0

transition函数中,你的count变量前面有一个var。移除它们,外部的count变量将会保留其值。


0

$(document).ready(function () {
    $("[data-count]").each(function () {
        counter($(this), .5)
    });

    function counter(el, speed) {
        let number = el.data("count"),
            count_type = el.data("count-type"),
            i = count_type === "up" ? 0 : number;

        let inter_val = setInterval(function () {
            el.text(i);
            i = count_type === "up" ? i + 1 : i - 1;
            if ((count_type === "up" && i > number) || (count_type === "down" && i < 0))
                clearInterval(inter_val);
        }, speed);
    }
});
span {
    background-color: #eeeeee;
    color: #333;
    padding: 15px 25px;
    margin: 10px;
    display: inline-block;
    width: 100px;
    text-align: center;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>COUNT UP EXAMPLE</p>
<span data-count="1650" data-count-type="up"></span>
<span data-count="2500" data-count-type="up"></span>
<span data-count="985" data-count-type="up"></span>
<br>
<p>COUNT DOWN EXAMPLE</p>
<span data-count="1650" data-count-type="down"></span>
<span data-count="2500" data-count-type="down"></span>
<span data-count="985" data-count-type="down"></span>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接