2015-09-15 5 views
0

У меня есть код, который опросит службу, и мне нужен способ отменить этот интервал clearTimeout через события. Тайм-ауты действуют как интервал, снова вызывающий setTimeout внутри функции.Node.js отменить setTimeout из события

Так, например, у меня есть другой объект, который выставлен как эмитент событий, и этот процесс опроса и испускает некоторые данные на этом пути. Вот упрощенный пример:

function events() { 

    var timer = true; 
    events.on('cancel', function() { 
    timer = false; 
    }); 

    function polling() { 
    //Get some data 
    events.emit('data', data); 

    if (timer || typeof timer == 'number') { 
     timer = setTimeout(polling, 1000); 
    } 
    } 

    polling(); 

} 

Это может работать, в основном, когда эта служба получает cancel события, он устанавливает таймер на ложь, что из-за проверки не будет продолжаться. Тем не менее, может быть шанс, когда он прошел условие, событие, сработал таймер, и теперь он продолжается.

Любая идея, если есть более пуленепробиваемый способ справиться с такими вещами? В основном отмена опроса на основе события.

+0

Вместо того, чтобы устанавливать 'timer' в false, как насчет вызова clearTimeout (timer)'? – bardzusny

ответ

0

Однако, возможно, есть шанс, когда он прошел условие, произошло событие, сброс таймера и теперь он продолжается.

Nope. Node.js является однопоточным и работает с помощью цикла событий, поэтому ничто не может прервать ваш текущий код, если вы его не разрешите (путем очередности и продолжения выполнения в другом событии, например, с setTimeout или process.nextTick).

Что вы должны сделать, если хотите избежать еще одного вызова polling, однако, используется clearTimeout.

function events() { 
    var timer = null; 

    events.on('cancel', function() { 
    clearTimeout(timer); 
    }); 

    function polling() { 
    //Get some data 
    events.emit('data', data); 

    timer = setTimeout(polling, 1000); 
    } 

    polling(); 
} 
+0

Ах да, у меня был clearTimeout, извините, пропустил это в моем примере. Интересно, поэтому, даже если вызывается setTimeout, начинается опрос, я отменяю его, не будет ли функция опроса продолжаться и перезапускаться с помощью нового setTimeout? – dzm

+0

@dave: Как это будет продолжаться? Если он получает данные от асинхронной функции, то да, вам понадобится дополнительная проверка. – Ryan

+0

Ах, извините, я не был достаточно ясен, да, данные поступают с удаленного URL-адреса – dzm

Смежные вопросы