javascript - 如何把setInterval的延时时间在每次执行里面的代码后成为一个随机时间?
PHP中文网
PHP中文网 2017-04-10 18:07:25
0
3
788
        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里的代码,但是这个随机数一旦生成以后就不会再变了,那我应该怎么再每次执行里面的代码后通过随机的方式也把间隔时间也改掉呢?

PHP中文网
PHP中文网

认证0级讲师

répondre à tous(3)
Ty80

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);
}
小葫芦
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();
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!