首页 > 如何把setInterval的延时时间在每次执行里面的代码后成为一个随机时间?

如何把setInterval的延时时间在每次执行里面的代码后成为一个随机时间?

        function flip(obj){
            obj.flip=setInterval(function(){
                var oTop=parseInt(getStyle(obj,'top'));
                oTop==0?doMove(obj,'top',10,-100):doMove(obj,'top',10,0);
            },Math.round(Math.random()*1000+1000))
        }

setInterval的时间我设置成了Math.round(Math.random()*1000+1000),这是一个随机数,每间隔这个随机出来的时间后会执行function里的代码,但是这个随机数一旦生成以后就不会再变了,那我应该怎么再每次执行里面的代码后通过随机的方式也把间隔时间也改掉呢?


function flip(obj){
            var timer = 0;//第一次随便给个时间间隔
            obj.flip=setInterval(function(){
                var oTop=parseInt(getStyle(obj,'top'));
                oTop==0?doMove(obj,'top',10,-100):doMove(obj,'top',10,0);
                timer = Math.round(Math.random()*1000+1000);//后面每次执行时都会重新生成一个时间间隔
            },timer)
        }

稍微抽象一下:

function repeatJob(jobFunc, intervalGenerator) {
    var lastTime = 0;
    var interval = 0;
    var seed = 0;

    function loop() {
        var now = new Date();
        if(now - lastTime > interval) {
            lastTime = now;

            interval = intervalGenerator()
            jobFunc();
        }
        seed = requestAnimationFrame(loop)
    }

    return {
        start: function() {
            seed = requestAnimationFrame(loop)
        },
        stop: function() {
            cancelAnimationFrame(seed);
        }
    }
}

function intervalGenerator() {
    return Math.round(Math.random()*1000+1000);
}

function job() {
    console.log('this job repeats');
    var oTop=parseInt(getStyle(obj,'top'));
    oTop==0?doMove(obj,'top',10,-100):doMove(obj,'top',10,0);
}

var r = repeatJob(job, intervalGenerator);
r.start();
//r.stop();

1.setInterval被调用后,就会被加入到定时器执行队列中等待绑定的函数被执行,也就是你设置的interval时间只会有效一次
2.想要实现你说的功能,请使用setTimeout函数

function flip(obj){
    var timeout=Math.round(Math.random()*1000+1000);
    clearTimeout(obj.flip);
    obj.flip=setTimeout(function timeoutFun(){
        var oTop=parseInt(getStyle(obj,'top'));
        oTop==0?doMove(obj,'top',10,-100):doMove(obj,'top',10,0);
        timeout=Math.round(Math.random()*1000+1000);
        obj.flip=setTimeout(timeoutFun,timeout);
    },timeout);
}
【热门文章】
【热门文章】