可以自动放弃使用setTimeouts排队的浏览器功能吗?

时间:2012-11-16 21:13:17

标签: javascript firefox google-chrome browser settimeout

我有一个递归轮询函数,可以执行一些操作,然后使用100毫秒的setTimeout调用自身。但是,如果我在递归轮询函数运行时调用另一个长时间执行某些操作的同步函数,我假设调用setTimeout为100ms的函数将排队,但是如果该long函数未在指定量内返回时间,浏览器会简单地丢弃排队的功能吗?我问这个是因为在调用其他长时间运行的函数之后,似乎递归轮询函数停止运行。我还用console.log检查了递归函数到达并调用了setTimeout,但传递给setTimeout的函数从未在调用long同步函数后被调用。这一切都在Chrome 23和Firefox 15中。

2 个答案:

答案 0 :(得分:0)

setTimeout(100,funct)不会保证在100ms之后你的函数会被执行。

如果浏览器在100分钟后正在执行其他操作或挂起,则会等到它返回并执行它。

这里

function pausecomp(millis)
 {
  var date = new Date();
  var curDate = null;
  do { curDate = new Date(); }
  while(curDate-date < millis);
 }

var time = new Date();

setTimeout(function(){
    var lapse=new Date() -time;
    alert(lapse; 
},100);

pausecomp(300);

例如程序循环300ms,而100ms setTimeout正在运行。 (http://jsfiddle.net/xX2b4/)

如果你运行它,输出将是300+值,因为300ms系统挂在循环中。

答案 1 :(得分:0)

setTimeout函数无法“自动”取消 - 只要您允许浏览器返回其事件循环,他们就会 被调用。

如果希望拥有一个自动取消自身的计时器功能,应该相对容易实现:

window.setTimeoutMaybe = function(f, t0, t1) {
    t1 = t1 || (t0 * 10);
    var then = new Date();
    return window.setTimeout(function() {
        var now = new Date();
        if (now - then < t1) {
            f();
        } 
    }, t0);
};

即。在f之后拨打t0,但仅限时间t1尚未过去。