javascript - 如何把setInterval的延时时间在每次执行里面的代码后成为一个随机时间?
PHP中文网
PHP中文网 2017-04-10 18:07:25
[JavaScript讨论组]
        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级讲师

全部回复(3)
PHP中文网

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();
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号