【问题标题】:Node JS - clearTimeout from previous instance or state节点 JS - 从前一个实例或状态清除超时
【发布时间】:2016-11-23 16:53:29
【问题描述】:

我正在开发一个与 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);

但是,玩家再次创建房间后,超时仍然运行。

我认为问题是超时没有被清除。这是我个人的观点。

任何想法或帮助将不胜感激。 谢谢

【问题讨论】:

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


    【解决方案1】:

    我看到至少两个问题:

    1. 那里有 两个 setTimeout 调用,而您不记得其中一个的句柄。如果您不想取消第二个 30 秒计时器,那没关系,但我想我应该把它叫出来。

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

      clearTimeout(general.timeouts);
      

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

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

      (根据测试它收到的额外参数不会打扰它,您可以将其缩短为general.timeouts.forEach(clearTimeout);。但同样,forEach 用三个参数调用它的回调,而不仅仅是一个,所以请务必在使用前进行测试。)

    【讨论】:

    • 嗨,谢谢。将首先检查它,并将更新结果。欢呼
    • 曼,认真的吗?你刚刚治好了我的头痛!我也将第二个超时添加到数组中。感谢您花时间帮助我。我很感激,标记!
    【解决方案2】:

    您的代码源中有两个问题。

    首先,您的函数中有两个计时器: 设置超时(...,90000) 和 设置超时(..., 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]);
    }
    

    【讨论】:

    • 感谢您指出问题所在,是的,这实际上就是问题所在。谢谢
    猜你喜欢
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多