我开发了一小部分演示软件,其中包含幻灯片和每张幻灯片的资源。渲染幻灯片时,将使用 setTimeout
方法循环遍历并在延迟后渲染其所有资源。看起来很甜蜜...
是啊!,要求已经改变,现在要求演示文稿像 PowerPoint 幻灯片一样,鼠标单击事件将导致下一个资源立即渲染到页面。
我的问题是;有没有办法让我的超时立即触发?我可以获取 timeoutid 并将其存储在堆栈中,因为它是在创建超时时返回的。唯一的其他选择是取消超时,然后重新创建元素,这比我想要做的处理要多得多,而且我不想太多地重构我的代码。
有什么想法吗?
最佳答案
你可以将它包装在一个像这样的闭包中:
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();
更新(现代 js):
let newTimeout = (handler, delay) => {
let id = setTimeout(handler, delay), clear = clearTimeout.bind(null, id);
return {id, clear, trigger: () => (clear(), handler())};
};
let timeout = newTimeout(() => console.log(new Date()), 1000);
// timeout.clear();
timeout.trigger();
关于javascript - 强制 setTimeout 比最初设置的时间更早触发其有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7689233/