如何让一个函数`clearInterval`本身?

时间:2014-02-12 16:37:27

标签: javascript ajax setinterval clearinterval

在我的代码中的某个地方,我称这个函数为:

function call_bid_button(id)
{
    bid_button(id);
    var refreshIntervalId = setInterval(function(){bid_button(id)},1000);
}

您可以看到调用函数bid_button()并为其设置interval

我希望bid_button()为自己激活clearInterval()。这是bid_button()

function bid_button(id)
{
    if (window.XMLHttpRequest)
    {
        xmlhttp=new XMLHttpRequest();
    }
    else
    {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
    if (xmlhttp.readyState==4 && xmlhttp.status==200 && xmlhttp.responseText=='')
    {
        document.getElementById("bid_button").innerHTML=xmlhttp.responseText;
        clearInterval(refreshIntervalId);
    }

    }
    xmlhttp.open("GET","the_bid_button.php?id="+id,true);
    xmlhttp.send(); 
    return false;
}

如您所见,我正试图从另一个函数调用clearInterval()。显然,这不起作用。这样做的正确方法是什么?

由于

3 个答案:

答案 0 :(得分:3)

您实际上只需将参考传递给间隔:

var interval_id;
interval_id = setInterval(function(){bid_button(id, interval_id); },1000);

function bid_button (id, interval_id) {
    clearInterval(interval_id);
}

这是有效的,因为稍后会调用区间中的回调函数。

请注意,由于实施bid_button的方式,某些时间间隔可能无法清除。例如,如果您丢失了互联网连接,它将继续尝试并尝试。请求将通过status=0解决。

答案 1 :(得分:2)

refreshIntervalId设置为全局变量,或者至少在两个函数的范围内。

var refreshIntervalId;

function call_bid_button(id)
{
    bid_button(id);
    refreshIntervalId = setInterval(function(){bid_button(id)},1000);
}

function bid_button(id)
{
    if (window.XMLHttpRequest)
    {
        xmlhttp=new XMLHttpRequest();
    }
    else
    {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
    if (xmlhttp.readyState==4 && xmlhttp.status==200 && xmlhttp.responseText=='')
    {
        document.getElementById("bid_button").innerHTML=xmlhttp.responseText;
        clearInterval(refreshIntervalId);
    }

    }
    xmlhttp.open("GET","the_bid_button.php?id="+id,true);
    xmlhttp.send(); 
    return false;
}

答案 2 :(得分:0)

var timer = setInterval(function(){
   alert('delayed 1ms');
},1000);

当这是通过的时候,只要你不再调用它,它就会通过。 如果您

clearInterval(timer);

如果计时器被包装在另一个函数中,var将其限定为该函数。您可以删除它以使其成为全局变量,也可以稍后在包装函数的相同范围内执行它。