取消Javascript超时

时间:2011-12-13 19:38:39

标签: javascript

我在Web服务器上托管了一个很长的进程。只需用户点击按钮,即可从网页触发该事物。一些Javascript定期通过Ajax进行轮询,以检查操作是否已完成服务器端。为此,我使用setInterval,稍后使用clearInterval停止投票。

如果这花费的时间太长(例如服务器已经崩溃),我希望通过某种超时来通知客户端。我做了一些研究,发现了setTimeout。问题是,如果操作在超时之前成功完成,我想取消这个。

  1. 怎么做?
  2. 你会建议采用不同的方法吗?
  3. PS:我特别针对 IE7 / IE8 ,但总是对某些 JQuery

    开放

3 个答案:

答案 0 :(得分:7)

只要将间隔的id存储在变量中,就可以随时使用它来清除间隔。

var interval = window.setInterval(yourFunction, 10000);

...elsewhere...

window.clearTimeout(interval);

有关详细信息,请参阅Mozilla Documentation's setInterval example

组合一个包含modified version of Mozilla's Example的快速JS小提琴。

答案 1 :(得分:4)

要清除setTimeout,请使用clearTimeout

答案 2 :(得分:0)

你想要两个计时器(如你所说)

  1. 重复间隔以进行下一次投票和
  2. 一次性到期,如果服务器永不响应则放弃
  3. 如果轮询成功,您希望清除轮询间隔并取消故障计时器。如果到期计时器触发,则要清除轮询间隔

    var checkCount = 0;
    function checkComplete() {
        console.log("test " + checkCount);
        if (checkCount++ > 10) {
            console.log("clearing timeout");
            window.clearInterval(pollInterval);
            window.clearTimeout(expireTimer);
        }
    }
    function cancelPolling(timer) {
        console.log("clearing poll interval");
        window.clearInterval(pollInterval);
    }
    var pollInterval = window.setInterval(checkComplete, 500);
    var expireTimer = window.setTimeout(cancelPolling, 10000);
    

    你可以摆弄checkCount常量“10” - 保持低位以模拟轮询成功,将其提高到达到checkCount之前发生的超时,模拟轮询失败。