Javascript 如何确保一次只运行一个递归设置超时链?

Javascript 如何确保一次只运行一个递归设置超时链?,javascript,recursion,google-chrome-extension,settimeout,Javascript,Recursion,Google Chrome Extension,Settimeout,我正在为个人使用做一个chrome扩展,它将递归调用setTimeout。我想确保在任何情况下,此扩展都不会意外地产生多个设置超时链 我已经这样做了,当我点击浏览器的行动,它调用clearTimeout。但是,我担心重新加载扩展时,旧的超时链是否会继续?可能还有其他我没有想到的情况。是否有一种行之有效的方法来防止意外创建多个超时链 似乎无法枚举活动javascript计时器:我以前解决过类似的问题: var timer; function foo(){ if(!timer) time

我正在为个人使用做一个chrome扩展,它将递归调用setTimeout。我想确保在任何情况下,此扩展都不会意外地产生多个设置超时链

我已经这样做了,当我点击浏览器的行动,它调用clearTimeout。但是,我担心重新加载扩展时,旧的超时链是否会继续?可能还有其他我没有想到的情况。是否有一种行之有效的方法来防止意外创建多个超时链


似乎无法枚举活动javascript计时器:

我以前解决过类似的问题:

var timer;
function foo(){
  if(!timer)
    timer = setTimeout(function (){
      //should print once every second only
      console.log(new Date());
      timer = null;
      foo();
  }, 1000)
}

foo();
foo();

因为javascript在处理下一个事件之前运行同步代码直到完成,所以这是安全的。

我的冲动是使用
clearTimeout
来抑制竞争性超时,但我也喜欢Johan Gov的答案,特别是在广义上:

var setOneTimeout = (function() {
  var timer
  return function(f, timeout) {
    if (!timer) {
      timer = setTimeout(function() {
        timer = null
        f()
      }, timeout)
    }
  }
})()

setOneTimeout(function() { console.log('foo') }, 500)
setOneTimeout(function() { console.log('bar') }, 500)
/* outputs "foo", only. */
或者,如果您有多个类别的超时,并且每个类别中只需要一个“运行”超时:

var setNamedTimeout = (function() {
  var timer = {}
  return function(name, f, timeout) {
    if (!timer[name]) {
      timer[name] = setTimeout(function() {
        timer[name] = null
        f()
      }, timeout)
    }
  }
})()

setNamedTimeout('foo', function() { console.log('foo') }, 500)
setNamedTimeout('bar', function() { console.log('bar') }, 500)
setNamedTimeout('bar', function() { console.log('bar') }, 500)
setNamedTimeout('bar', function() { console.log('bar') }, 500)
setNamedTimeout('bar', function() { console.log('bar') }, 500)
setNamedTimeout('foo', function() { console.log('foo') }, 500)
/* outputs only one instance of "foo" and "bar" */

你能添加一些代码吗?因为还不完全清楚您“递归调用”setTimeout的确切方式。在任何情况下,如果您在后台页面脚本中执行此操作,则所有计时器将在重新加载时销毁。只有注入的内容脚本才能存活,除非您也重新加载网页。另外,我建议使用
chrome.alarms
API。