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的時間我設(shè)置成了Math.round(Math.random()*1000+1000),這是一個隨機(jī)數(shù),每間隔這個隨機(jī)出來的時間后會執(zhí)行function里的代碼,但是這個隨機(jī)數(shù)一旦生成以后就不會再變了,那我應(yīng)該怎么再每次執(zhí)行里面的代碼后通過隨機(jī)的方式也把間隔時間也改掉呢?
認(rèn)證0級講師
1.setInterval被調(diào)用后,就會被加入到定時器執(zhí)行隊(duì)列中等待綁定的函數(shù)被執(zhí)行,也就是你設(shè)置的interval時間只會有效一次
2.想要實(shí)現(xiàn)你說的功能,請使用setTimeout函數(shù)
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);//后面每次執(zhí)行時都會重新生成一個時間間隔
},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();