节点 JS - 来自先前实例或状态的 clearTimeout
Node JS - clearTimeout from previous instance or state
我正在开发一个与 setTimeout 有很大关系的电报机器人项目。目前我的问题是,我无法清除超时,即使我已经将其设置为 module.exports
.
这是我的 。
问题是,每当我清除超时时,它什么都不做。超时仍在继续。
这是我创建超时的代码
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));
}
每当 game/room 完成时,我都会调用此函数。
clearTimeout(general.timeouts);
但是,玩家再次创建房间后,超时仍然运行。
我认为问题是超时没有被清除。这是我的观点。
任何想法或帮助将不胜感激。
谢谢
我至少看到两个问题:
那里有 两个 setTimeout
调用,您不记得其中一个的句柄。如果你不想取消第二个 30 秒计时器,没关系,但我想我应该把它叫出来。
clearTimeout
接受 单个计时器句柄,但您在此处向其传递一个数组:
clearTimeout(general.timeouts);
相反,您需要单独清除它们:
general.timeouts.forEach(function(handle) { clearTimeout(handle) });
(经过测试它收到的额外参数不会打扰它,您可以将其缩短为 general.timeouts.forEach(clearTimeout);
。但同样,forEach
使用三个参数调用其回调,不只是一个,所以一定要在使用前进行测试。)
您的代码源中有两个问题。
首先,您的函数中有两个计时器:
设置超时(...,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]);
}
我正在开发一个与 setTimeout 有很大关系的电报机器人项目。目前我的问题是,我无法清除超时,即使我已经将其设置为 module.exports
.
这是我的
问题是,每当我清除超时时,它什么都不做。超时仍在继续。
这是我创建超时的代码
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));
}
每当 game/room 完成时,我都会调用此函数。
clearTimeout(general.timeouts);
但是,玩家再次创建房间后,超时仍然运行。
我认为问题是超时没有被清除。这是我的观点。
任何想法或帮助将不胜感激。 谢谢
我至少看到两个问题:
那里有 两个
setTimeout
调用,您不记得其中一个的句柄。如果你不想取消第二个 30 秒计时器,没关系,但我想我应该把它叫出来。clearTimeout
接受 单个计时器句柄,但您在此处向其传递一个数组:clearTimeout(general.timeouts);
相反,您需要单独清除它们:
general.timeouts.forEach(function(handle) { clearTimeout(handle) });
(经过测试它收到的额外参数不会打扰它,您可以将其缩短为
general.timeouts.forEach(clearTimeout);
。但同样,forEach
使用三个参数调用其回调,不只是一个,所以一定要在使用前进行测试。)
您的代码源中有两个问题。
首先,您的函数中有两个计时器: 设置超时(...,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]);
}