当前一个事件尚未完成处理时,如何处理Javascript中的后续事件?

当前一个事件尚未完成处理时,如何处理Javascript中的后续事件?,javascript,events,javascript-events,Javascript,Events,Javascript Events,当前一个事件尚未完成处理时,如何处理Javascript中的后续事件 我有一个定义了onkeyup事件的文本框。在大多数情况下,当事件发生时,它调用的函数的处理时间可能比触发下一个onkeyup事件所需的时间更长 是否有一种可靠的方法可以中断/放弃上一次的onkeyup事件,然后开始下一次事件?您可以这样做: var isRunning = false; var i = 0; function runFunc() { i++; if (isRunning == false) {

当前一个事件尚未完成处理时,如何处理Javascript中的后续事件

我有一个定义了onkeyup事件的文本框。在大多数情况下,当事件发生时,它调用的函数的处理时间可能比触发下一个onkeyup事件所需的时间更长


是否有一种可靠的方法可以中断/放弃上一次的onkeyup事件,然后开始下一次事件?

您可以这样做:

var isRunning = false;
var i = 0;
function runFunc() {
    i++;
    if (isRunning == false) {
        isRunning = true;
        keepRunning();
    }
}
function keepRunning() {
    while (i > 0) {
        realProcessing();
        i--;
    }
    isRunning = false;
}
var el = document.getElementById('field');
el.onkeyup = runFunc;
keepRunning()将继续执行实际处理函数,执行次数与触发keyup事件的次数相同 我记下了这一点,并没有进行测试(我感到羞耻),但通过这种方式,你可能会获得你的结果(或类似的结果)。

ps:我仍然认为上面的代码可能存在并发问题,我非常有兴趣找到解决方案(或者有人向我证明没有并发问题)。

Javascript的工作方式与GUI类似,因此不会同时处理两个事件

在我看来,如果您的处理太繁重,最好的解决方案是更改您的it,以便可以在小步骤中执行。然后,当您得到一个keyup事件时,您只需执行第一步,每一步都执行一个
setTimeout
调用,延迟为零,以触发下一步

这种重新启动计算的方法很简单


它之所以有效,是因为超时总是优先级最低的(即,如果有另一个键控,则会立即处理,并且您将重新启动计算,而不是继续上一个键控)。

我假设您正在使用
setTimeout
setInterval
调用长时间运行的进程。你能避免吗?可能会显示一些代码。我刚刚意识到,如果有其他事件在队列中,您希望跳过对一个事件的处理,很抱歉,我之前没有看到它。一种想法是将事件推送到一个数组中,并使keepRunning中的循环在执行时从一开始就删除它们(一个事件队列),如果i>1,则跳过第一个。