如何限制setInterval完成的迭代次数

时间:2012-07-26 19:06:11

标签: javascript cookies

我向用户展示视频广告。我不会托管这些广告;我从另一家公司那里得到它们。

点击广告时,会在用户的浏览器中留下一个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);可以进行的迭代次数

5 个答案:

答案 0 :(得分:15)

当您致电setInterval时,它会返回一个间隔ID,您可以通过调用clearInterval来停止该间隔ID。因此,您需要计算变量中的迭代次数,一旦达到某个计数,请使用clearIntervalsetInterval提供的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);