Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.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
Javascript 是否可以使用自定义ID设置Interval,以便稍后从其他服务中清除它?_Javascript - Fatal编程技术网

Javascript 是否可以使用自定义ID设置Interval,以便稍后从其他服务中清除它?

Javascript 是否可以使用自定义ID设置Interval,以便稍后从其他服务中清除它?,javascript,Javascript,我想使用setInterval方法注册一个新的间隔,该方法将一直运行,直到我停止为止。我想从另一个服务(api路由)停止它。 但问题是我没有时间间隔的ID。当记录interval对象时,我所能做的就是: let interval = setInterval(() => console.log(`Hello World`), 3000); console.log(`interval:`, interval); // we got this in the log: interval: Ti

我想使用
setInterval
方法注册一个新的间隔,该方法将一直运行,直到我停止为止。我想从另一个服务(api路由)停止它。 但问题是我没有时间间隔的ID。当记录interval对象时,我所能做的就是:

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
对象。)这是您传递给的内容。因此,将该对象传递给要停止间隔的另一个服务


你在评论中说:


但是我不能直接将它发送到另一个服务,该服务应该从DB或其他地方获取它。我试图将其存储在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.mysetterval=…
const mysetterval=require(…)

但是我不能直接将它发送到另一个服务,该服务应该从DB或其他地方获取它。我试图将它存储在MongoDB中,但出现了一个错误,因为mongo不会存储这样的对象。@Raz-“但我不能直接将它发送到另一个服务,该服务应该从DB或其他地方提取它。”为什么?这项服务是否与调度时间间隔的代码处于同一进程中?无论如何,如果不是,则无法清除计时器。如果是,请查看我的更新。也许我可以使用cronjob来代替它?不,这不是我所要求的