2016-11-23 8 views
0

Я работаю над проектом телеграммы бота, который имеет много общего с setTimeout. И в настоящее время моя проблема в том, что я не могу убрать тайм-аут, даже если я уже положил его на module.exports.Узел JS - clearTimeout из предыдущего экземпляра или состояния

Это мой previous question.

Проблема в том, что всякий раз, когда я очищаю таймаут, он ничего не делает. Тайм-аут все еще продолжается.

Вот мой код, чтобы создать тайм-аут

var createSingleton = require('create-singleton'); 

var p3 = createSingleton(function mySingleton() { 
    service.canceledTimeout(res,bot) 
}); 

var myInstance3 = new p3(); 

я получил модуль под названием обещает

module.exports.timeouts = []; //general.timeouts 

И я поставил объект SetTimeout к этому модулю

canceledTimeout = function(res,bot) { 
    return general.timeouts.push(setTimeout(function() { 
     return updateState(general.THIRTY_SECONDS_REMAINING_CHECK_STATE, res) 
     .then (function(msg) { 
      if (msg !== null) { 
      return bot.sendMessage(res.chat.id, msg, general.baseFormat()) 
      .then (function(x) { 

       setTimeout(function() { 
       updateState(general.TIMEOUT, res) 
       .then (function(msg) { 
        if (msg !== null) { 
        return bot.sendMessage(res.chat.id, msg, general.baseFormat()); 
        } 
       }); 
       },30000); 

      });    
      } 
     }); 
     },90000)); 
} 

Всякий раз, когда игра/room закончен, я вызываю эту функцию.

clearTimeout(general.timeouts); 

Но, после того, как игрок снова создал комнату, тайм-аут по-прежнему работает.

Я думаю, проблема в том, что таймаут не очищается. Это с моей точки зрения.

Любая мысль или помощь будут оценены ребятами. Благодаря

ответ

2

Я вижу, по крайней мере, два вопроса:

  1. Есть два setTimeout звонков там, и вы не помнящие ручку одного из них. Если вы не хотите отменять этот второй 30-секундный таймер, все в порядке, но я подумал, что я должен это назвать.

  2. clearTimeout принимает одной ручкой таймера, но вы передаете это массив здесь:

    clearTimeout(general.timeouts); 
    

    Вместо этого, вам нужно очистить их по отдельности:

    general.timeouts.forEach(function(handle) { clearTimeout(handle) }); 
    

    (при условии что дополнительные аргументы, которые он получает, не беспокоят его, вы можете сократить его до general.timeouts.forEach(clearTimeout);. Но опять же, forEach называет его обратный вызов тремя аргументами, а не только одним, поэтому не забудьте проверить перед использованием.)

+0

привет человек, спасибо. сначала проверит его и обновит результат. cheers – Webster

+1

mann, серьезно? вы вылечили мою головную боль только сейчас! Я добавил второй тайм-аут в массив. Спасибо, что потратили время, чтобы помочь мне. Я ценю это, отмечен! – Webster

0

В источнике кода есть две проблемы.

Во-первых, у вас есть два таймера в вашей функции: SetTimeout (..., 90000) и SetTimeout (..., 30000)

Во-вторых, вы не можете передать массив в метод clearTimeout. Это не имеет никакого эффекта. Если вы хотите, чтобы очистить таймер в массиве, вы должны очистить их один за другим, например:

var timeouts = [timer1, timer2, timer3]; 
//loop through the array and clear them one by one 
for (var i = 0; i < timeouts.length; i++) { 
    clearTimeout(timeouts[i]); 
} 
+0

спасибо, что указал проблему на человека, и да, это проблема на самом деле. благодаря – Webster