Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭存储在计时器/websocket客户端对数组中的JavaScript setInterval计时器_Javascript_Websocket_Global_Setinterval_Clearinterval - Fatal编程技术网

关闭存储在计时器/websocket客户端对数组中的JavaScript setInterval计时器

关闭存储在计时器/websocket客户端对数组中的JavaScript setInterval计时器,javascript,websocket,global,setinterval,clearinterval,Javascript,Websocket,Global,Setinterval,Clearinterval,所以我有一个节点js/websocket服务器,我想在这里存储多个setInterval计时器实例 我将它们存储在一个[timer,client]对象数组中,当客户端断开连接时,我希望通过这些对象,然后通过该数组,在将它们从数组中删除之前,关闭与断开连接的客户端配对的所有计时器 移除与客户端连接的对象正在工作,但是计时器没有停止 我是这样宣布计时器的- clientSchedulePairs.push([setInterval(makeVisibleHandler, master_period,

所以我有一个节点js/websocket服务器,我想在这里存储多个setInterval计时器实例

我将它们存储在一个[timer,client]对象数组中,当客户端断开连接时,我希望通过这些对象,然后通过该数组,在将它们从数组中删除之前,关闭与断开连接的客户端配对的所有计时器

移除与客户端连接的对象正在工作,但是计时器没有停止

我是这样宣布计时器的-

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