15

我向我的用户展示视频广告。顺便说一句,我不主持这些广告;我从另一家公司得到它们。

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

4

5 回答 5

25

当您调用时setInterval,它会返回一个间隔 ID,然后您可以通过调用来停止它clearInterval。因此,您需要计算变量中的迭代次数,一旦达到一定的计数,就clearInterval使用setInterval.

var iterations = 0;
var interval = setInterval(foo, 10000);
function foo() {
    iterations++;
    if (iterations >= 5)
        clearInterval(interval);
}

活生生的例子

于 2012-07-26T19:08:33.293 回答
4

这应该这样做:

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();
于 2012-07-26T19:09:03.260 回答
1

WindowTimers.setInterval(func, delay[, param1, param2, ...])

第三个参数和后面的参数setInterval是传递给区间函数的可选参数。请注意,IE9 和更早版本不支持这些可选参数。

我们可以通过避免使用全局或外部范围来利用这一点。如下所示。间隔函数通过参数跟踪计数器的限制和当前增量opts

runTask函数接受一个强制fn参数,该参数返回一个布尔值以确定计时器的任务是否已完成。在下面的示例中运行了两个任务,每个任务的运行速度和要满足的条件都不同。

前两个任务完成,但最后一个任务在满足条件之前用完了尝试。

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>

于 2015-04-03T19:01:27.700 回答
0

您只需要某种全局计数器变量来跟踪。例如,以下代码在每次页面加载时最多只会运行 cookie 检查 20 次。

var numChecks = 0;

function checkCookie()
{
    ...

    numChecks++;
    if (numChecks < 20) setTimeout("checkCookie()", 10000);
}

setTimeout("checkCookie()", 10000);
于 2012-07-26T19:08:00.307 回答
0

将回调传递给 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);
于 2015-07-10T14:17:17.273 回答