强制setTimeout在最初设置之前触发其有效负载

lga*_*dos 19 javascript jquery settimeout

我开发了一小部分演示软件,其中包含每张幻灯片的幻灯片和资源.渲染幻灯片时,使用该setTimeout方法延迟所有资产并在延迟后渲染.看起来很甜......

Yaaay !,要求已经改变,现在要求演示文稿像PowerPoint幻灯片一样,鼠标单击事件将导致下一个资产立即呈现给页面.

我的问题是; 有没有办法让我的超时立即开火?我可以在堆栈中获取并存储在创建超时时返回的timeoutid.唯一的另一个选择是取消超时,然后重新创建元素,这是我想要做的更多处理,我不想过多地重构我的代码.

有任何想法吗?

Dio*_*ane 21

如果您将计时器设置为:

var timer1 = window.setTimeout(mainFunction,500)
Run Code Online (Sandbox Code Playgroud)

通过这样做立即调用它:

window.clearTimeout(timer1)
mainFunction()
Run Code Online (Sandbox Code Playgroud)

关键是将功能与计时器分开.


Kil*_*roy 20

你可以将它包装在这样的闭包中:

function createTimeout(timeoutHandler, delay) {
    var timeoutId;
    timeoutId = setTimeout(timeoutHandler, delay);
    return {
        clear: function() {
            clearTimeout(timeoutId);
        },
        trigger: function() {
            clearTimeout(timeoutId);
            return timeoutHandler();
        }
    };
}

var a = new Date();

var timeout = createTimeout(function() { console.log(a); }, 1000);
// timeout.clear();
timeout.trigger();
Run Code Online (Sandbox Code Playgroud)

  • 优雅的解决方案 (2认同)

Kos*_*gos 17

简短的回答是否定的.除非你保留一份要解雇的方法清单,否则你不能做你要求的.然后,您可以取消计时器并触发相应的方法.