javascript - 是否可以使用自定义 ID 设置间隔,以便稍后从其他服务中清除它?
问题描述
我想使用setInterval
将一直运行的方法注册一个新的间隔,直到我停止它。我想从另一个服务(api路由)中阻止它。但问题是我没有区间的ID。记录间隔对象时,我所拥有的就是:
let interval = setInterval(() => console.log(`Hello World`), 3000);
console.log(`interval:`, interval);
// we got this in the log:
interval: Timeout {
_called: false,
_idleTimeout: 3000,
_idlePrev: [TimersList],
_idleNext: [TimersList],
_idleStart: 2765,
_onTimeout: [Function],
_timerArgs: undefined,
_repeat: 3000,
_destroyed: false,
[Symbol(unrefed)]: false,
[Symbol(asyncId)]: 29,
[Symbol(triggerId)]: 1 }
解决方案
这是Node.js 中间隔的“id”。(在浏览器上它是一个数字,但在 Node.js 上它是一个Timeout
对象。)这是你传递给clearInterval
. 因此,将该对象传递给您要停止间隔的其他服务。
在评论中你说:
但我不能直接将它发送到另一个服务,该服务应该从数据库或其他东西中提取它。我试图将它存储在 MongoDB 中并得到一个错误,因为 mongo 不会存储这样的对象。
假设其他服务在同一进程中(否则,它不能取消计时器),您可以编写一个模块来为计时器分配数字 ID:
let lastId = 0;
const timers = new Map();
export function mySetInterval(callback, ms) {
const id = ++lastId;
timers.set(id, setInterval(callback, ms));
return id;
}
export function myClearInterval(id) {
const timer = timers.get(id);
if (timer) {
timers.delete(id);
clearInterval(timer);
}
}
设置间隔定时器:
import { mySetInterval } from "./my-module";
saveTimerIdInDB(mySetInterval(() => console.log(`Hello World`), 3000));
清除它:
import { myClearInterval } from "./my-module";
myClearInterval(getTimerIdFromDB());
注意:我在那里使用 JavaScript 标准模块语法(“ESM”)。但是您可以使用 Node.js 的旧模块语法(“CJS”)做同样的事情,并相应地切换到exports.mySetInterval = ...
和const mySetInterval = require(...)
。
推荐阅读
- docker - 无法连接到从另一个容器作为容器运行的烧瓶,尽管我可以 ping
- rubygems - 如何解决 fastlane v 2.162.0 的 gem 安装冲突
- java - 在线程“main”java.lang.ArrayIndexOutOfBoundsException 错误中获取异常,并且一直试图找出解决方案
- redis - Redis 独立服务器正在动态更改配置
- c++ - 使用链表调用堆栈的默认构造函数获取错误 C2760
- javascript - 在子道具上分配 onClick 时出错
- augmented-reality - 如果我们需要为室内导航创建一个锚点“网格”,最佳实践是什么?
- node.js - 猫鼬模型拒绝更新对象数组中的对象数组
- python - 无法通过 iFrame 内的 xpath 单击元素 - Selenium
- x86 - 无法使 ACPI GPE 和通知正常工作