关闭存储在计时器/websocket客户端对数组中的JavaScript setInterval计时器
所以我有一个节点js/websocket服务器,我想在这里存储多个setInterval计时器实例 我将它们存储在一个[timer,client]对象数组中,当客户端断开连接时,我希望通过这些对象,然后通过该数组,在将它们从数组中删除之前,关闭与断开连接的客户端配对的所有计时器 移除与客户端连接的对象正在工作,但是计时器没有停止 我是这样宣布计时器的-关闭存储在计时器/websocket客户端对数组中的JavaScript setInterval计时器,javascript,websocket,global,setinterval,clearinterval,Javascript,Websocket,Global,Setinterval,Clearinterval,所以我有一个节点js/websocket服务器,我想在这里存储多个setInterval计时器实例 我将它们存储在一个[timer,client]对象数组中,当客户端断开连接时,我希望通过这些对象,然后通过该数组,在将它们从数组中删除之前,关闭与断开连接的客户端配对的所有计时器 移除与客户端连接的对象正在工作,但是计时器没有停止 我是这样宣布计时器的- clientSchedulePairs.push([setInterval(makeVisibleHandler, master_period,
clientSchedulePairs.push([setInterval(makeVisibleHandler, master_period, item, name), client]);
然后当客户端断开连接时,尝试这样关闭时间表-
clearInterval(clientSchedulePairs[i][0]);
在我的研究中,我发现了这个问题-
这意味着我需要将计时器设为全局变量?但这并没有帮助,因为如果我有多个定时器用于多个客户机,我如何才能使它们成为全局变量
我将它们存储在全局声明的全局常量数组中,例如-
const clientSchedulePairs = [];
但是它不起作用
知道它不工作的原因是因为它没有声明为全局变量吗?或者我怎样才能绕过这个问题,让它发挥作用?在将计划添加到数组之前,我已经尝试在方法中将其声明为变量
谢谢
更新--
我让它工作关闭定时器不确定它是否与客户端断开连接的方式有关,在我将for循环移除到一个外部方法中,该方法将客户端套接字作为变量,然后通过客户端/定时器对数组进行循环,检查客户端并移除它们之后,它开始工作。然而,我现在遇到了一种奇怪的问题
正如我所说,我正在循环一个clientTimerPairs数组,并检查与该计时器配对的客户机是否===到客户机_套接字,该套接字是从当客户机断开连接时调用该方法时传入的,在此循环中,调用该方法-
clearInterval(clientTimerPairs[i].interval);
计时器也会关闭,但是我现在从clientTimerPairs数组中删除客户端计时器元组时遇到问题
我无法将它们从阵列中删除,所以我将其更改为这样工作-
var indexToRemove = [];
for (var i = 0; i < clientTimerPairs.length; i++) {
if (clientTimerPairs[i].pairedClient === client_socket) {
clearInterval(clientTimerPairs[i].interval);
indexToRemove.push(i);
}
}
for (var i = 0; i < indexToRemove.length; i++) {
console.log('removing index ' + indexToRemove[i] + '...');
clientSchedulePairs.splice(indexToRemove[i], 1);
}
但是,即使我控制台打印indexToRemove,并且其中包含所有索引0-6,因为在测试期间,我只连接了1个客户端和6个计时器,它应该通过clientTimerPairs并删除每个索引,因此clientTimerPairs是空的,然而,出于某种奇怪的原因,而不是从6到0大小,数组的大小始终为3
即使它打印删除索引行6次,并说它正在删除索引0-5,但clientTimerPairs数组中始终剩余3项
知道为什么会发生这种情况吗?push语句没有提供正确的键值对。使用ES6MAP来保护实际的对怎么样 然而,它应该按预期的那样工作
const timers = [];
for (let i = 0; i < 5; i++) {
timers.push([setInterval(runTimer.bind({ id: i}), 100), i]);
}
function runTimer() {
console.log(`running for id ${this.id}`);
}
setTimeout(() => {
console.log('clearing timers')
for (let i = 0; i < timers.length; i++) {
clearInterval(timers[i][0]);
}
}, 2000);
这将返回一个包含第一和第三个元素的数组。他只是将一个数组放入另一个数组,而不是键值对。@jered我建议使用键值对。此时,他必须遍历所有连接的客户机,检查多维数组的第二个条目是否设置为断开连接的客户机的id,并获取同一数组的第一个元素并清除间隔。使用类似es6 Map的东西比数组快得多,或者使用对象来存储连接套接字ID的未知键的成对值。正如您所说,我将其更改为键-值对,因为这是一个更好的选择,但由于某些原因,clearInterval函数仍然不适用于我…我甚至注释掉了所有数组内容,只是转到我声明setInterval变量的地方,在下一行中,在该变量上使用了clearInterval,计时器仍在运行。你知道为什么吗?@Chase你可以通过更新帖子来显示更多代码,或者足够复制该问题吗?如果添加您正在使用的节点的版本,可能会有所帮助。嘿,实际上我让它开始关闭计时器,在我断开/关闭浏览器窗口后,套接字消息停止在计时器上发送,因此计时器正在关闭,我遇到了一个新问题,我无法从clientTimerPair数组中删除所有的计时器/客户端对,因为某些原因,这很奇怪,如果你想了解发生了什么,我在上面发布了一个更新的响应。谢谢你的帮助。
let items = ['one', 'two', 'three', 'four'];
let indices = [1, 3];
items = items.filter((item, index) => indices.indexOf(index) === -1);