节点JS - 来自先前实例或状态的clearTimeout

时间:2016-11-23 08:41:23

标签: javascript node.js instance telegram telegram-bot

我正在开发一个与setTimeout有很多关系的电报机器人项目。目前我的问题是,我无法清除超时,即使我已经把它放在module.exports上。

这是我的previous question

问题是,每当我清除超时时,它什么都不做。超时仍在继续。

这是我创建超时的代码

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

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

var myInstance3 = new p3();

我有一个名为promises的模块

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 个答案:

答案 0 :(得分:2)

我至少看到两个问题:

  1. 那里有两个 clearTimeout来电,你不记得其中一个的句柄。如果你不想取消第二个30秒计时器,那很好,但我想我应该把它叫出来。

  2. clearTimeout(general.timeouts); 接受单个计时器句柄,但您在此处传递了一个数组:

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

    相反,您需要单独清除它们:

    general.timeouts.forEach(clearTimeout);

    (根据测试结果,它收到的额外参数不会打扰它,你可以将它缩短为forEach。但同样,seesion.dataTask(with:request) { (data,res,err) in print("Hello") } 用三个args调用它的回调,不只是一个,所以一定要在使用之前进行测试。)

答案 1 :(得分: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]);
}