как очистить timeout в node.js - PullRequest
9 голосов
/ 18 июня 2011

Привет. Мы разрабатываем приложение в node.js, socket.io и redis.

у нас есть такая процедура:

exports.processRequest = function (request,result) {
     var self = this;
     var timerknock;
     switch(request._command) {
    case 'some command': // user login with username 
            // some statement 
            timerknock=setTimeout(function() {
                //some  statemetn
            },20*1000);
        case 'other command ':
            // some statement    
            clearTimeout(timerknock);
      }
};

, но когда оно отменяет таймер, оно не получаетОтменено при выполнении другой команды. Что мне делать, чтобы отменить таймер?

1 Ответ

11 голосов
/ 18 июня 2011

Похоже, у вас нет операторов break, что может вызвать проблемы (когда вы попытаетесь очистить таймер, он создаст новый таймер и очистит его, но старый все равно будет работать).Может быть, это опечатка.

Ваша главная проблема - вы храните «ссылку» таймера в локальной переменной.Это должно быть либо закрытым, либо глобальным, иначе, когда вы выполните функцию для очистки переменной, timerknock потеряет свое значение и попытается clearTimeout(undefined), что, конечно, бесполезно.Я предлагаю простое закрытие:

exports.processRequest = (function(){
   var timerknock;
   return function (request,result) {
      var self = this;
      switch(request._command) {
      case 'some command': // user login with username 
         // some statement 
         timerknock=setTimeout(function() {
            //some  statemetn
         },20*1000);
      case 'other command ':
         // some statement    
         clearTimeout(timerknock);
      }
   };
})();

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

...