我想知道如何实现: 在随机数量的时间后生成一个随机数。并重复使用它。
function doSomething(){
// ... do something.....
}
var rand = 300; // initial rand time
i = setinterval(function(){
doSomething();
rand = Math.round(Math.random()*(3000-500))+500; // generate new time (between 3sec and 500"s)
}, rand);
反复做。
到目前为止,我能够生成一个随机间隔,但它会持续相同,直到页面被刷新(生成的时间间隔不同)。
由于
答案 0 :(得分:82)
这是一个非常干净清晰的方法:
http://jsfiddle.net/Akkuma/9GyyA/
function doSomething() {}
(function loop() {
var rand = Math.round(Math.random() * (3000 - 500)) + 500;
setTimeout(function() {
doSomething();
loop();
}, rand);
}());
修改强>
说明: 循环仅存在于立即调用的函数上下文中,因此它可以递归调用自身。
答案 1 :(得分:5)
这样的事情应该有用 - 改为使用setTimeout()
,这样你每次都可以设置一个新的随机值:
function doSomething() {
alert("doing something");
}
function init() {
var myFunction = function() {
doSomething();
var rand = Math.round(Math.random() * (3000 - 500)) + 500; // generate new time (between 3sec and 500"s)
setTimeout(myFunction, rand);
}
myFunction();
}
$(function() {
init();
});
答案 2 :(得分:4)
每次弯道时设置间隔(并先清除它)
function doSomething(){
// ... do something.....
}
var i;
var rand = 300;
function randomize() {
doSomething();
rand = Math.round(Math.random()*(3000-500))+500;
clearInterval(i);
i = setInterval('randomize();', rand);
}
i = setInterval('randomize();', rand);
或尝试使用setTimeout(并在randing后再次设置)
答案 3 :(得分:1)
把帽子扔进戒指
doTheAction()
取决于您是否要将setTimeout
置于comp
回调中。我认为把它放在前/外是没关系的。如果你想要初始延迟,那么把它放在里面,如果没有,为了简单起见,把它放在外面。
答案 4 :(得分:1)
这是一个可重用的版本,可以清除。启用了IntelliSense的开源as an NPM package。
实用功能
const setRandomInterval = (intervalFunction, minDelay, maxDelay) => {
let timeout;
const runInterval = () => {
const timeoutFunction = () => {
intervalFunction();
runInterval();
};
const delay = Math.floor(Math.random() * (maxDelay - minDelay + 1)) + minDelay;
timeout = setTimeout(timeoutFunction, delay);
};
runInterval();
return {
clear() { clearTimeout(timeout) },
};
};
用法
const interval = setRandomInterval(() => console.log('Hello World!'), 1000, 5000);
// // Clear when needed.
// interval.clear();