如何实现WebSocket客户端接收指定名称后20分钟内不再处理其消息?
解决方案
要实现同一目标名称20分钟内仅打印一次的需求,我们可以通过维护一个记录目标名称最后处理时间的缓存对象来实现,具体修改如下:
修改后的完整代码
// 存储已处理目标的最后时间戳,键为目标名称,值为时间戳 const processedTargets = {}; // 暂停时长:20分钟 = 20*60*1000毫秒 const COOLDOWN_DURATION = 20 * 60 * 1000; socket.addEventListener("message", (event) => { event.data.text().then((dat) => { if (!dat.includes("example")) return; const A = dat.replace(/.*?({.*}).*/, "$1"); if (!A.match(/exapleMessage/)) return; const at = JSON.parse(A); const AK = at.M[0].M.OID; if (AK < 0) return; let targetName, allianceName, attackerName, alliance = "none Alliance"; const targetID = at.M[0].M.TID; const attacker = at.M[0].M.OID; at.O.forEach((item) => { const oid = item.OID; if (targetID === oid) { targetName = item.N; } if (attacker === oid) { allianceName = item.AN; attackerName = item.N; } }); const typeOfAttack = at.M[0].ATT; const targetCastle = at.M[0].M.TA[10]; const targetX = at.M[0].M.TA[1]; const targetY = at.M[0].M.TA[2]; const targetcoordinate = `${targetX}:${targetY}`; const target = typeof targetName !== "undefined" ? targetName : targetcoordinate; function secondsToTime(seconds) { const arr = new Date(seconds * 1000) .toISOString() .substr(11, 8) .split(":"); const days = Math.floor(seconds / 86400); arr[0] = parseInt(arr[0], 10) + days * 24; return arr.join(":"); } const t1 = at.M[0].M.TT - at.M[0].M.PT; const allArrs = [ ...at.M[0].GA.L, ...at.M[0].GA.M, ...at.M[0].GA.R, ...at.M[0].GA.RW, ]; const result = allArrs.reduce((accumulator, currentArray) => { accumulator += currentArray[1]; return accumulator; }, 0); // 核心逻辑:检查冷却时间 if (targetName) { const now = Date.now(); // 获取该目标上次处理的时间,默认0(从未处理过) const lastProcessedTime = processedTargets[targetName] || 0; if (now - lastProcessedTime > COOLDOWN_DURATION) { console.log(`NAME: ${targetName}`); // 更新该目标的最后处理时间 processedTargets[targetName] = now; } } }); });
关键修改说明
- 添加缓存对象:
processedTargets用于记录每个目标名称最后一次打印的时间戳,确保每个名称独立控制冷却时间 - 定义冷却时长:
COOLDOWN_DURATION设置为20分钟的毫秒数,方便后续调整 - 优化变量声明:将原代码中零散的
var改为let/const,避免变量提升导致的潜在问题,同时整理了遍历逻辑,简化代码结构 - 冷却判断逻辑:在准备打印
targetName时,计算当前时间与上次处理时间的差值,只有当差值大于冷却时长时才执行打印,并更新缓存的时间戳
这样修改后,同一目标名称在20分钟内只会被打印一次,其他目标名称不受任何影响,完全符合需求。
内容的提问来源于stack exchange,提问作者Jeffrey
相关产品推荐
相关产品推荐

