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

Javascript 如何限制setInterval完成的迭代次数,javascript,cookies,Javascript,Cookies,我向我的用户显示视频广告。顺便说一句,我不主持这些广告;我从另一家公司买的 每当点击广告时,它都会在用户的浏览器中留下一个cookie。 我创建了一个函数,每10秒检查一次cookie的存在 我想做的是限制这个函数可以运行的次数或者它可以运行的秒数 功能如下: function checkCookie() { var cookie=getCookie("PBCBD2A0PBP3D31B"); if (cookie!=null && cookie!="") { aler

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

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

您只需要某种全局计数器变量来跟踪。例如,下面的代码在每次页面加载时最多只运行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);