存储setTimeout并稍后调用它

时间:2016-03-23 10:13:21

标签: javascript delay settimeout execution

请查看以下代码:

function increase(i)
                 {
                  i++; if(i==100) return;
                  var timer=setTimeout(function(){increase(i);}, 8);
                  }

这个setTimeout函数会立即执行,但我想要 它以后执行。为什么?

示例:

if (a==b) clearTimeout(timer);

现在,当某些事情发生时,我需要在另一个函数中停止并退出此函数:

{{1}}

困扰我的是,无论何时,变量计时器都会被分配 功能增加运行,但它不需要,我相信这是不好的做法。这就是为什么我需要在函数运行之前只分配一次,并在需要到达时执行它。

我希望你理解,顺便说一下,这些只是例子,而不是我的代码。

4 个答案:

答案 0 :(得分:0)

由于delay中的setTimeout需要毫秒作为时间单位,所以在您的代码中,您将函数设置为在8ms后执行,感觉就像是立即执行。 / p>

答案 1 :(得分:0)

如果希望一个函数的操作改变另一个函数的条件,只需在两个函数的范围内声明一个布尔变量,并根据终止函数改变它的值。

例如,看看这段代码:

var exit = false;

function increase(i) {
    if(i==100 || exit) return;
    setTimeout(function(){ increase(++i) }, 1000);
}

function terminator(a, b){
    exit = (a==b);
}

increase(0);

在这里,如果用一对相同的参数调用terminator,如:

setTimeout(function(){ terminator(true, 1) }, 5000) // timeout of 5 seconds means increase will run 5 times

setTimeout函数中increase的递归调用将不会达到(5秒后),因为函数将在到达该行代码之前返回。

如果永远不会调用terminator,或者调用不相等的参数,例如:

setTimeout(function(){ terminator(true, false) }, 5000) // using setTimeout here is just arbitrary, for consistency's sake

increase只有在完成100次递归后才会超时(换句话说,经过100秒后)

希望这有帮助!

答案 2 :(得分:0)

function increase(i, boolean) {
  i++;
  if (i == 100) return;
  if (boolean) {
    var timer = setTimeout(function() {
      increase(i, true);
      console.log(i);
    }, 8);
  }
}

increase(1,true);

你提出了一些额外的论点 功能?

答案 3 :(得分:0)

您可以在函数之外声明调用setTimeout的变量,在调用函数时将变量定义为setTimeout;从另一个函数调用clearTimeout(),其中变量引用setTimeout作为参数。



var timer = null, // declare `timer` variable
  n = 0, // reference for `i` inside of `increase`
  i = 0,
  a = 50,
  b = 50,
  // pass `increase` to `t`, call `increase` at `setTimeout` 
  t = function(fn, i) {
    // define timer
    timer = setTimeout(function() {
      fn(i)
    }, 8)
  };

function increase(i) {
  console.log(i);
  // set `n` to current value of `i` to access `i`:`n` 
  // to access `i` value outside of `t`, `increase` functions
  n = i++; 
  if (i == 100) return;
  t(increase, i); // call `t`
}

increase(i);

// do stuff outside of `t`, `increase`
setTimeout(function() {
  // clear `timer` after `200ms` if `a == b`
  if (a == b) {clearTimeout(timer)};
  alert(n)
}, 200)