Как вы справляетесь с последующими событиями в Javascript, когда предыдущий еще не закончил обработку? - PullRequest
0 голосов
/ 02 февраля 2011

Как вы справляетесь с последующими событиями в Javascript, когда предыдущий еще не закончил обработку?

У меня есть текстовое поле с определенным событием onkeyup . Когда событие происходит, оно вызывает функцию, для обработки которой может потребоваться больше времени, чем для следующего события onkeyup в большинстве ситуаций.

Есть ли надежный способ прервать / отказаться от предыдущего onkeyup события и просто начать следующее?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2011

Javascript работает как графический интерфейс, поэтому два события не обрабатываются одновременно.

На мой взгляд, лучшим решением, если ваша обработка слишком тяжелая, было бы изменить ее так, чтобы ее можно было выполнять небольшимишаги.Затем, когда вы получаете событие keyup, вы просто делаете первый шаг, и каждый шаг выполняет setTimeout вызов с нулевой задержкой для запуска следующего шага

. Таким образом, перезапуск вычислений тривиален.

Это работает, потому что таймауты всегда имеют самые низкие приоритеты (т. Е. Если будет другой keyup, он будет обработан немедленно, и вы перезапустите вычисление вместо продолжения предыдущего).

0 голосов
/ 02 февраля 2011

Вы можете сделать что-то в этом духе:

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: Я все еще думаю, что у вас могут быть проблемы параллелизма с кодом выше, и я бы очень заинтересовалсянахождение решений для тех (или кто-то, доказывающий мне, что нет проблем параллелизма).

...