尽早执行settimeout

Gol*_*wby 8 javascript jquery settimeout

我正在使用debouncing来在超时后使用settimeout执行事件.我遇到的问题是,其他javascript事件期望这些事件同步发生.由于它们现在在超时后执行,我希望能够通过其他javascript事件过早地触发它们(因此那些需要它们的事件不会失败).

Anywhom,如果我这样做:

timeout = setTimeout(function() { alert('hi'); }, 10000);
Run Code Online (Sandbox Code Playgroud)

,我希望在10秒钟之前发生这种情况,我该怎么做?

如有必要,解决方案可能涉及jquery.谢谢!

编辑:是否可以通过访问超时对象来执行此操作?

Cᴏʀ*_*ᴏʀʏ 6

所以,如果你做出任何延迟它自己功能的事情:

function sayHi() {
    alert('hi');
}
Run Code Online (Sandbox Code Playgroud)

您可以使用超时和常规函数调用:

var timeout = setTimeout(sayHi, 10000); // say hi after 10 seconds
Run Code Online (Sandbox Code Playgroud)

或者在超时到期之前调用它,只需在需要时调用该函数:

sayHi();
Run Code Online (Sandbox Code Playgroud)

我在这里走在正确的轨道上吗?如果您需要取消超时,请调用clearTimeout()您的timeout变量.

if (timeout)
    clearTimeout(timeout);
Run Code Online (Sandbox Code Playgroud)

  • @Cory +1 但我不得不不同意`否则就没有太大目的`。如果你有一个注册的 ID,那么你可以有一个 `triggerTimeout`、`getTimeout` 甚至 `updateTimeout` 方法以及 set 和 clear 对我来说是有意义的——遗憾的是它们不存在,但它们可以被编写作为一个 polyfill,包含对 `setTimeout` 和 `clearTimeout` 的定制覆盖。 (4认同)

Jan*_*olm 6

您无法使用标准跟踪它setTimeout,但Javascript允许您根据需要增强功能.

例如,您可以拥有自己的增强功能setTimeout:

var _setTimeout = window.setTimeout;
var timeouts = [];
window.setTimeout = function(fn, ms) {
    var id = _setTimeout(fn, ms);
    timeouts[id] = fn;
    return id;
};

window.premature = function(id) {
    var fn = timeouts[id];
    if (fn) {
        clearTimeout(id);
        if (fn instanceof String) {
            eval(fn);
        } else {
            fn()
        }
    }
};


function printDate(str) {
    $("body").append("<p>" + str + ". " + new Date() + "</p>");

}

$(function() {
    var id1 = setTimeout(function() { printDate("id1"); }, 10000);
    var id2 = setTimeout(function() { printDate("id2"); }, 10000);
    printDate("first one");
    // just to demonstrate that the string version works too
    setTimeout("window.premature(" + id1 +")", 5000);
});
Run Code Online (Sandbox Code Playgroud)

您可以在jsFiddle中看到它的运行情况

请注意,这个简单的黑客在超时发生时没有考虑清除使用过的id,但它只是为了表明你可以在Javascript中做这种事情,如果你真的需要它.