gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:47:13 24 4
gpt4 key购买 nike

所以我有一个 Node js/websocket 服务器,我想在其中存储 setInterval 计时器的多个实例...

我将它们存储在一个 [timer, client] 对象数组中,当客户端断开连接时我想要单步执行这些对象,然后单步执行该数组并关闭与断开连接的客户端配对的所有计时器,然后再将它们从中删除数组。

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

我像这样声明计时器 -

clientSchedulePairs.push([setInterval(makeVisibleHandler, master_period, item, name), client]);

然后尝试在客户端断开连接时像这样关闭计划-

clearInterval(clientSchedulePairs[i][0]);

在我的研究中我发现了这个问题 -

clearInterval() is not stopping setInterval() - Firefox Extension Development

这说明我需要将计时器设为全局变量?但这没有帮助,因为如果我有多个客户端的多个计时器,我怎样才能使它们成为全局变量?

我将它们存储在全局声明的全局 const 数组中,例如 -

const clientSchedulePairs = [];

但是它不起作用......

你知道它不工作的原因是否是因为它没有声明为全局变量吗?或者我如何解决这个问题并让它发挥作用? (在将时间表添加到数组之前,我已经尝试在我的方法中将其声明为变量)

谢谢。

已更新---

我让它工作关闭定时器 --- 不确定它是否与客户端断开连接的方式有关,在我将 for 循环删除到将客户端套接字作为变量接收的外部方法中之后,然后循环遍历我的客户端/计时器对数组并检查客户端并将其删除,它开始工作。然而,我现在遇到了一种奇怪的问题......

正如我所说,我正在循环访问 clientTimerPairs 数组,并检查与该计时器配对的客户端是否 === 到客户端断开连接时调用该方法时传入的 client_socket,在此循环中,调用这个--

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是空的,但是,由于某种奇怪的原因,数组的大小始终是 3,而不是从 6 变为 0!

尽管它打印删除索引行 6 次并表示正在删除索引 0 - 5,但 clientTimerPairs 数组中始终会留下 3 个项目!

知道为什么会发生这种情况吗?

最佳答案

该推送语句未提供正确的键值对。使用 es6 Map 来保护实际对怎么样?

但是,它应该按预期工作。

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

编辑帖子中的添加内容

拼接完全按照预期进行。假设您有一个包含 6 个元素的数组。您正在使用索引数组清除数组中的元素并删除第一个元素。该数组长度变为 5。第二个索引指向第 6 个元素。当您尝试按索引拼接第六个元素时,没有任何反应。这是因为您从数组中删除了一个元素,这使得第 6 个元素移动到了第 5 个位置。

一个简单的解决方案可能是使用 es6 过滤器:

let items = ['one', 'two', 'three', 'four']; 
let indices = [1, 3];

items = items.filter((item, index) => indices.indexOf(index) === -1);

这将返回一个包含第一个和第三个元素的数组。

关于javascript - 关闭存储在计时器/Websocket 客户端对数组中的 JavaScript setInterval 计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45336475/

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