setTimeout动态延迟

时间:2016-03-10 02:25:46

标签: javascript settimeout setinterval

我的全局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将被执行,并且值将在执行10 {秒myTimer后保存到db(使用saveFormCB()函数)

3 个答案:

答案 0 :(得分:2)

首先,你的iife正在传递window,所以你的myTimer是对窗口对象的引用,set和clear是全局的。测试一下。如果你进入严格模式,你会收到错误。

你需要的不是让它成为一个生命并使它成为一个构造函数,并使它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);

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

哦,你没有正确地将变量传递给闭包。

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)