我向用户展示视频广告。我不会托管这些广告;我从另一家公司那里得到它们。
点击广告时,会在用户的浏览器中留下一个Cookie。 我创建了一个每10秒检查一次cookie存在的函数。
我想要做的是限制此功能可以运行的次数或它可以运行的秒数。
以下是功能:
function checkCookie()
{
var cookie=getCookie("PBCBD2A0PBP3D31B");
if (cookie!=null && cookie!="")
{
alert("You clicked on an ad" );
}
setInterval("checkCookie()", 10000);
所以回顾一下。我想限制setInterval("checkCookie()", 10000);
可以进行的迭代次数
答案 0 :(得分:15)
当您致电setInterval
时,它会返回一个间隔ID,您可以通过调用clearInterval
来停止该间隔ID。因此,您需要计算变量中的迭代次数,一旦达到某个计数,请使用clearInterval
和setInterval
提供的ID。
var iterations = 0;
var interval = setInterval(foo, 10000);
function foo() {
iterations++;
if (iterations >= 5)
clearInterval(interval);
}
<强> Live example 强>
答案 1 :(得分:3)
这应该这样做:
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();
答案 2 :(得分:1)
WindowTimers.setInterval(func, delay[, param1, param2, ...])
3 rd 参数和setInterval
中的前向参数是传递给区间函数的可选参数。注意,IE9及更早版本不支持这些可选参数。
我们可以通过避免使用全局或外部范围来利用这一点。如下所示。 interval函数通过opts
参数跟踪计数器的限制和当前增量。
runTask
函数采用强制fn
参数,该参数返回一个布尔值,以确定计时器的任务是否已完成。在下面的示例中运行了两个tak,每个都在每个运行的速率和要满足的条件下变化。
前两个任务完成,但最后一个任务在满足条件之前用完了。
function writeLine(el, text) {
el.innerHTML += [].slice.call(arguments, 1).join(' ') + '\n';
}
function runTask(options, interval, limit) {
var interval = setInterval(function(opts) {
opts.incr = (opts.incr || 0) + 1;
if (opts.fn(opts)) {
clearInterval(interval);
writeLine(opts.el, '>> Task finished...');
} else if (opts.incr > limit) {
clearInterval(interval);
writeLine(opts.el, '>> Exceeded limit of ' + limit);
} else {
writeLine(opts.el, '>> Attempt: ' + opts.incr + '/' + limit);
}
}, interval, options);
}
// 5 atttempts to reach 4 in 250ms.
runTask({
fn : function(opts) { return opts.incr === 4; },
el : document.querySelectorAll('div.col')[0]
}, 250, 5);
// 10 atttempts to reach 7 in 100ms.
runTask({
fn : function(opts) { return opts.incr === 7; },
el : document.querySelectorAll('div.col')[1]
}, 100, 10);
// 10 atttempts to reach 15 in 50ms.
runTask({
fn : function(opts) { return opts.incr === 15; },
el : document.querySelectorAll('div.col')[2]
}, 50, 10);
.col {
display: inline-block;
width: 175px;
font-family: monospace;
white-space: pre;
border: thin solid black;
vertical-align: top;
padding: 4px;
}
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
答案 3 :(得分:0)
您只需要某种全局计数器变量来跟踪。例如,以下代码每页最多只运行cookie检查20次。
var numChecks = 0;
function checkCookie()
{
...
numChecks++;
if (numChecks < 20) setTimeout("checkCookie()", 10000);
}
setTimeout("checkCookie()", 10000);
答案 4 :(得分:0)
将回调传递给间隔函数,后者又更新全局范围内的计数器:
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);