1

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

4

2 回答 2

0

setTimeout(100, funct) 不会保证在 100 毫秒后您的函数将被执行。

如果在 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);

​ 例如,当 100 毫秒 setTimeout 运行时,程序循环 300 毫秒。(http://jsfiddle.net/xX2b4/)

如果您运行它,输出将是 300+ 值,因为 300 毫秒系统被挂在循环中。

于 2012-11-16T21:28:33.997 回答
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在 time 之后调用t0,但前提是 timet1还没有过去。

于 2012-11-16T21:48:06.753 回答