2016-11-23 37 views
0

我正在研究一個與setTimeout有很大關係的電報機器人項目。而目前我的問題是,我無法清除超時,即使我已經把它放在module.exports上。我的previous question節點JS - 來自以前實例或狀態的clearTimeout

問題是,每當我清除超時,它什麼都不做。超時仍然繼續。

這裏是我的代碼來創建超時

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)); 
} 

每當遊戲/房間完成後,我稱這個功能。

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

喜的人,謝謝。將首先檢查它,並將更新結果。歡呼聲, – Webster

+1

曼恩,認真嗎?你剛剛治好了我的頭痛!我也向數組添加了第二個超時。感謝您花時間幫助我。我讚賞它,標記! – 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