首页 > 解决方案 > 是否可以使用自定义 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 }

标签: javascript

解决方案


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(...)


推荐阅读