从不同的地方取消setInterval(NodeJS变量范围)

时间:2017-09-21 14:12:42

标签: javascript node.js scope

我设置了一个全局变量,然后使用可以从模块中其他位置调用的函数在其中存储setInterval。我还设置了一个取消setInterval的函数,该函数可用于从模块中的其他函数中取消setInterval。请参阅下面的代码段:

var availabilityCheckInterval

function repeatAvailabilityCheckStart (session) {
  availabilityCheckInterval = setInterval(() => {
    // Call an API
    if (successful) {
      repeatAvailabilityCheckStop()
    }
  }, 15000)
}

function repeatAvailabilityCheckStop () {
  clearInterval(availabilityCheckInterval)
}

这适用于我的本地计算机和暂存环境,但似乎在使用并发用户进行生产时失败(或者它可能从未实际工作过......)。

我是否遗漏了与变量范围相关的内容?我在使用并发用户的生产环境中使用setInterval()是天真的吗?

1 个答案:

答案 0 :(得分:1)

当我说'将它包裹在一个物体中时。在评论中我的意思是这样的:

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