我正在设置一个全局变量,然后使用可以从模块中其他位置调用的函数在其中存储 setInterval。我还设置了一个取消 setInterval 的函数,该函数可用于取消模块内其他函数的 setInterval。请参阅下面的片段:
var availabilityCheckInterval
function repeatAvailabilityCheckStart (session) {
availabilityCheckInterval = setInterval(() => {
// Call an API
if (successful) {
repeatAvailabilityCheckStop()
}
}, 15000)
}
function repeatAvailabilityCheckStop () {
clearInterval(availabilityCheckInterval)
}
这在我的本地计算机和临时环境上运行,但在并发用户的生产中似乎失败(或者可能从未真正起作用......)。
我在这里遗漏了与变量范围相关的内容吗?我在具有并发用户的生产环境中使用 setInterval()
太天真了?
最佳答案
当我在评论中说“将其包装在一个对象中”时,我的意思是这样的:
class Interval {
constructor (f, n) {
this.fn = f;
this.repeatInterval = n;
this.handle = null;
}
get running () {
return this.handle !== null;
}
run (...args) {
if (!this.running) {
this.handle = setInterval(this.fn, this.repeatInterval, ...args);
} else {
// optionally throw, display msg, whatever
}
return this;
}
stop () {
clearInterval(this.handle);
this.handle = null;
return this;
}
}
现在您可以拥有每个请求句柄/间隔。对每个请求只需执行
let intvl = new Interval(someFn, 15000).run();
并清理:
intvl.stop();
关于javascript - 从不同地方取消setInterval(NodeJS变量范围),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46346261/