Javascript 如何限制setInterval完成的迭代次数
我向我的用户显示视频广告。顺便说一句,我不主持这些广告;我从另一家公司买的 每当点击广告时,它都会在用户的浏览器中留下一个cookie。 我创建了一个函数,每10秒检查一次cookie的存在 我想做的是限制这个函数可以运行的次数或者它可以运行的秒数 功能如下:Javascript 如何限制setInterval完成的迭代次数,javascript,cookies,Javascript,Cookies,我向我的用户显示视频广告。顺便说一句,我不主持这些广告;我从另一家公司买的 每当点击广告时,它都会在用户的浏览器中留下一个cookie。 我创建了一个函数,每10秒检查一次cookie的存在 我想做的是限制这个函数可以运行的次数或者它可以运行的秒数 功能如下: function checkCookie() { var cookie=getCookie("PBCBD2A0PBP3D31B"); if (cookie!=null && cookie!="") { aler
function checkCookie()
{
var cookie=getCookie("PBCBD2A0PBP3D31B");
if (cookie!=null && cookie!="")
{
alert("You clicked on an ad" );
}
setInterval("checkCookie()", 10000);
总而言之。我想限制
setInterval(“checkCookie()”,10000)的迭代次数
可以使您只需要某种全局计数器变量来跟踪。例如,下面的代码在每次页面加载时最多只运行20次cookie检查
var numChecks = 0;
function checkCookie()
{
...
numChecks++;
if (numChecks < 20) setTimeout("checkCookie()", 10000);
}
setTimeout("checkCookie()", 10000);
var numChecks=0;
函数checkCookie()
{
...
numChecks++;
if(numChecks<20)setTimeout(“checkCookie()”,10000);
}
setTimeout(“checkCookie()”,10000);
当您调用时,它会返回一个间隔ID,然后您可以使用该ID通过调用来停止它。因此,您需要对变量中的迭代次数进行计数,一旦迭代次数达到某个计数,请使用提供的ID
这应该可以做到:
function checkCookie() {
var cookie = getCookie("PBCBD2A0PBP3D31B");
if (cookie != null && cookie != "") {
alert("You clicked on an ad");
}
if (counter > 10) clearInterval(clr);
counter++;
clr = setInterval(function(){checkCookie()}, 10000);
}
var counter = 0;
checkCookie();
setInterval
中的第三个参数和以后的参数是传递给interval函数的可选参数。注意,IE9和更早版本不支持这些可选参数
我们可以通过避免使用全局或外部范围来利用这一优势。如下图所示。间隔功能通过opts
参数跟踪计数器的限制和当前增量
runTask
函数采用一个必需的fn
参数,该参数返回一个布尔值,以确定计时器的任务是否已完成。在下面的示例中,有两个TAK运行,每个TAK的运行速率和要满足的条件各不相同
前两个任务完成,但最后一个任务在满足条件之前已尝试完毕
函数写入线(el,文本){
el.innerHTML+=[].slice.call(参数,1).join(“”)+'\n';
}
函数runTask(选项、间隔、限制){
var间隔=设置间隔(函数(opts){
opts.incr=(opts.incr | | 0)+1;
如果(选项fn(选项)){
间隔时间;
writeLine(opts.el,'>>任务完成…);
}否则如果(opts.incr>limit){
间隔时间;
写入线(opts.el,'>>超过'+限制的限制);
}否则{
写线(opts.el,'>>尝试:'+opts.incr+'/'+limit);
}
}、间隔、选项);
}
//5次尝试在250毫秒内达到4次。
运行任务({
fn:函数(opts){return opts.incr==4;},
el:document.querySelectorAll('div.col')[0]
}, 250, 5);
//10次尝试在100毫秒内达到7次。
运行任务({
fn:函数(opts){return opts.incr==7;},
el:document.queryselectoral('div.col')[1]
}, 100, 10);
//10次尝试在50毫秒内达到15次。
运行任务({
fn:函数(opts){return opts.incr==15;},
el:document.queryselectoral('div.col')[2]
}, 50, 10);代码>
.col{
显示:内联块;
宽度:175px;
字体系列:monospace;
空白:预处理;
边框:薄而实的黑色;
垂直对齐:顶部;
填充:4px;
}
将回调传递给Interval函数,该函数反过来更新全局范围内的计数器:
var countIntervals = 0,
intervalFunc = function(_callback){
console.log(countIntervals);
if(countIntervals > 5) {
clearInterval(setIntervalVar);
} else {
// do stuff
_callback();
}
};
setIntervalVar = setInterval(intervalFunc.bind(null, function(){
countIntervals++;
}), 500);
注意:不要将字符串传递给setInterval
,它使用eval
!传递函数:setInterval(checkCookie,10000)代码>。注意:这只适用于Mootools,而不适用于jquery,尤其是在您的应用程序中demo@Amine那不是真的。它是纯js,在任何地方都可以使用。
var countIntervals = 0,
intervalFunc = function(_callback){
console.log(countIntervals);
if(countIntervals > 5) {
clearInterval(setIntervalVar);
} else {
// do stuff
_callback();
}
};
setIntervalVar = setInterval(intervalFunc.bind(null, function(){
countIntervals++;
}), 500);