Javascript 设置超时动态延迟

Javascript 设置超时动态延迟,javascript,settimeout,setinterval,Javascript,Settimeout,Setinterval,我有如下全局setTimeout功能: myTimer = function(){ var timer; this.set = function(saveFormCB) { timer = setTimeout(function() { saveFormCB(); }, 10000) }; this.clear = function() { clearInterval(timer); }; return this; }(); 如果我执

我有如下全局
setTimeout
功能:

myTimer = function(){
  var timer;
  this.set = function(saveFormCB) {
    timer = setTimeout(function() {
      saveFormCB();
    }, 10000)
  };
  this.clear = function() {
    clearInterval(timer);
  };
  return this;
}();
如果我执行以下操作,上面的命令将延迟saveFormCB()执行10秒:

myTimer.clear()
myTimer.set(function () {
  saveFormCB()
});
有些组件需要比10秒更快的执行速度,比如说5秒。所以我需要动态延迟myTimer函数。我做了以下工作,但没有工作:

myTimer = function(a){
  var timer;
  this.set = function(saveFormCB) {
    timer = setTimeout(function() {
      saveFormCB();
    }, a || 10000)
  };
  this.clear = function() {
    clearInterval(timer);
  };
  return this;
}();
任何帮助都将不胜感激

谢谢

其他信息


myTimer
在输入事件时执行。每次不键入时,将执行
myTimer
,并在执行
myTimer
10秒后将值保存到db(使用saveFormCB()函数)

哦,您没有正确地将变量传递到闭包中

var THERE_SHOULD_BE_A_VALUE_HERE = 5000;
myTimer = function(a){
  var timer;
  this.set = function(saveFormCB) {
    timer = setTimeout(function() {
      saveFormCB();
    }, a || 10000)
  };
  this.clear = function() {
    clearInterval(timer);
  };
  return this;
}(THERE_SHOULD_BE_A_VALUE_HERE);
但这不是动态的,这就是你想要的,对吗?简单的解决方案是向mytimer中的set函数添加一个参数,然后使用第二个参数执行它

 myTimer = function(){
      var timer;
      this.set = function(saveFormCB,a) {
        timer = setTimeout(function() {
          saveFormCB();
        }, a || 10000)
      };
      this.clear = function() {
        clearInterval(timer);
      };
      return this;
    }();
你可以这样称呼它:

myTimer.set(function(){console.log('Hello World')},5000)

首先,我认为这个代码是不对的

myTimer.set(function () { //new function
  saveFormCB() // calling another function inside this function.
});
相反,你可以这样做

myTimer.set(saveFormCB); //directly pass the function call as a parameter.
现在来让你的计时器动态。使用下面的代码

 myTimer = function(){ //remove the parameter here
  var timer;
  this.set = function(saveFormCB,Timer) { //add the timer parameter here
    timer = setTimeout(function() {
      saveFormCB();
    }, Timer || 10000)
  };
  this.clear = function() {
    clearInterval(timer);
  };
  return this;
}();
你可以像下面那样执行它

myTimer.set(saveFormCB,3000);

首先,您的iLife是这样传递的
window
,因此myTimer是对window对象的引用,set和clear是全局变量。测试一下。如果你进入严格模式,你会得到一个错误

你需要的不是让它成为一个iife,让它成为一个构造函数,让它成为
Timer
,就像构造函数的惯例一样

Timer = function(a){
  var timer;
  this.set = function(saveFormCB) {
    timer = setTimeout(function() {
      saveFormCB();
    }, a || 10000)
  };
  this.clear = function() {
    clearInterval(timer);
  };
  return this;
};

var myTimer = new Timer(500);

你不应该用
clearTimeout
代替
clearTimeout
?我不知道。这是用于自动保存表单的。clearInterval用于清除setTimeout但尚未执行,setTimeout用于新值假定您通过
a
变量传递了一个数字,则此选项应该有效。请提供更多代码或示例,说明如何执行这些函数。@brod on input事件。每次不键入时,将执行myTimer。它应该是
myTimer.set(saveFormCB)
(去掉括号)@jasonscript谢谢。包装saveFormCB本身没有什么问题。实际上,按照您现在的方式,saveFormCb将在Firefox中传递一个参数,即从您请求时起有多大的延迟。这可能会对其他情况产生不良的副作用,在其他情况下,您希望在没有任何参数的情况下调用它。他已经使用的方式没有任何错误,但我只是指出,没有必要这样做,也没有参数的函数调用应该像
saveFormCB()
而不是
saveFormCB
对吗??让我知道如果我的知识是错误的那正是我所指出的,你的建议并不完全等同于OP所做的。另外,正如我对我的答案所作的评论一样,
在原始帖子(以及您的答案)中设置不正确。请注意,
指向窗口。在这种情况下,请参阅我的答案,它允许您创建多个独立计时器