javascript - 如何停止 setTimeout 循环?

标签 javascript css extjs settimeout

我正在尝试构建一个带有图像 Sprite 的加载指示器,我想出了这个函数

function setBgPosition() {
   var c = 0;
    var numbers = [0, -120, -240, -360, -480, -600, -720];
    function run() {
       Ext.get('common-spinner').setStyle('background-position', numbers[c++] + 'px 0px');
        if (c<numbers.length)
        {
            setTimeout(run, 200);
        }else
        {
            setBgPosition();
        }
    }
    setTimeout(run, 200);
}

所以输出看起来像这样

http://jsfiddle.net/TTkre/

我不得不使用 setBgPosition();在 else 中保持循环运行所以现在我的问题是一旦我想要[加载完成]如何停止这个循环?

最佳答案

setTimeout 返回一个计时器句柄,您可以使用它来通过 clearTimeout 停止超时。

例如:

function setBgPosition() {
    var c = 0,
        timer = 0;
    var numbers = [0, -120, -240, -360, -480, -600, -720];
    function run() {
        Ext.get('common-spinner').setStyle('background-position', numbers[c++] + 'px 0px');
        if (c >= numbers.length) {
            c = 0;
        }
        timer = setTimeout(run, 200);
    }
    timer = setTimeout(run, 200);

    return stop;

    function stop() {
        if (timer) {
            clearTimeout(timer);
            timer = 0;
        }
}

因此您可以将其用作:

var stop = setBgPosition();
// ...later, when you're ready to stop...
stop();

请注意,我没有让 setBgPosition 再次调用自身,而是让它将 c 设置回 0。否则,这是行不通的。另请注意,我使用 0 作为超时未决时的句柄值; 0 不是 setTimeout 的有效返回值,因此它是一个方便的标志。

这也是我认为使用 setInterval 而不是 setTimeout 会更好的(少数)地方之一。 setInterval 重复。所以:

function setBgPosition() {
    var c = 0;
    var numbers = [0, -120, -240, -360, -480, -600, -720];
    function run() {
        Ext.get('common-spinner').setStyle('background-position', numbers[c++] + 'px 0px');
        if (c >= numbers.length) {
            c = 0;
        }
    }
    return setInterval(run, 200);
}

这样使用:

var timer = setBgPosition();
// ...later, when you're ready to stop...
clearInterval(timer);

尽管如此,我还是想找到一种方法,通过检测是否满足某些完成条件,让 setBgPosition 停止自身。 p>

关于javascript - 如何停止 setTimeout 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8443151/

相关文章:

javascript - ExtJS 组件从 afterrender 和 focus 事件中获取不同的位置?

javascript - asp.net 在 javascript 中公开所有 View 模型数据

javascript - 如何从现有的 svg 创建 img

javascript - 不支持选项 "useFindAndModify"

javascript - 如何在 Javascript 中一次打印所有变量?

extjs4 中 Uploadfield 的验证

html - 图像上的导航箭头

html - 使页面适合屏幕

javascript - 垂直菜单滑动动画不能正常工作

extjs - 单击蒙版时如何关闭模态窗口extjs?