gpt4 book ai didi

javascript - Node JS - 从先前的实例或状态清除超时

转载 作者:行者123 更新时间:2023-12-02 13:55:00 25 4
gpt4 key购买 nike

我正在开发一个与 setTimeout 有很大关系的 Telegram Bot 项目。目前我的问题是,即使我已经将其放在 module.exports 上,我也无法清除超时。

这是我的 previous question .

问题是,每当我清除超时时,它都不会执行任何操作。超时仍然继续。

这是我创建超时的代码

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

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

var myInstance3 = new p3();

我有一个名为 Promise 的模块

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

但是,当玩家再次创建房间后,超时仍然存在。

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

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

最佳答案

我至少看到两个问题:

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

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

    clearTimeout(general.timeouts);

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

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

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

关于javascript - Node JS - 从先前的实例或状态清除超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40759545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com