如何在上一次结束后执行某个功能?

时间:2017-07-02 20:24:19

标签: javascript jquery timer

人。它是一个计时器。我想运行计时器,当它结束时做其他事情(如警告),然后再用其他时间运行。但我不能总是只执行第二次调用:



$(document).ready(function() {
    timer(5,timer(25));

    // timer(5);
    // timer(25); do not work... only exec de last one
   
});

function timer(countTo,callback){

	var time = 10; /* how long the timer runs for */
	var initialOffset = '440';
	var i = 1
	var interval = setInterval(function() {
	    $('.circle_animation').css('stroke-dashoffset', initialOffset-(i*(initialOffset/countTo)));
	    $('h2').text(i);
	    if (i == countTo) {
	        clearInterval(interval);
	    }
	    i++;  
	}, 1000);
	callback();
}




哪种解决方案最好?有些东西我不理解......无论如何,谢谢!

5 个答案:

答案 0 :(得分:1)

嗯,先关闭:

timer(5,timer(25));

如果您认为此行会执行timer(5),然后在timer(5)结束时执行timer(25),那么您就错了。这实际上是立即评估timer(25),并将其返回值(undefined)作为第二个参数传递给timer(5,undefined)

如果您打算将其作为回调传递,则需要传递一个函数。所以你可以这样做:

timer(5,timer.bind(null,25));

但是,就此而言,在尝试调用它之前,你甚至都没有检查callback是否存在,所以你可能无论如何都会收到引用错误。

答案 1 :(得分:0)

这是你想要的吗?

timer(5,function(){timer(25)});

答案 2 :(得分:0)

timer(5,timer(25));

启动两个计时器并将第二个结果( undefined )传递给第一个作为回调。你想要:

timer(5,timer.bind(window,25));

如果 i == countTo ...

,则需要执行回调

答案 3 :(得分:0)

你的问题在这里:

freqs=c(0.7, 0.2, 0.05, 0.01, 0.001)
x=0:(length(freqs)-1)

df=data.frame(x=x, y=freqs)

library("ggplot2")

ggplot(df)  + 
geom_bar(mapping = aes(x = x, y = y),stat =   "identity")+ scale_y_log10() 

您应该输入

timer(5,timer(25));

因为timer(5, function(){ timer(25) }); //or using ES6 syntax timer(5, () => timer(25)); 返回其值(此函数不返回值,因此它尝试调用undefined),而不是该函数。 另请阅读有关闭包的信息,这可能会有所帮助。

答案 4 :(得分:0)

您需要运行本身callback())功能,而不是运行timer()。您还需要在函数内运行for循环,以检查函数已运行的次数。如果它达到你想要的最大值,那就突破了。这样它就无法无限期地运行。

在下面的示例中,timer()函数执行五次,这是我通过调用timer(5)所假设的。

$(document).ready(function() {
  timer(5);
});

function timer(countTo) {
  for (var iterations = 0; iterations < countTo; iterations++) {
    var time = 10; /* how long the timer runs for */
    var initialOffset = '440';
    var i = 1
    var interval = setInterval(function() {
      $('.circle_animation').css('stroke-dashoffset', initialOffset - (i * (initialOffset / countTo)));
      $('h2').text(i);
      if (i == countTo) {
        clearInterval(interval);
      }

    }, 1000);
    timer();
    console.log("Iteration:", iterations + 1);
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

要在此之后运行该功能25次,您只需在timer(25)之后直接致电timer(5)

$(document).ready(function() {
  timer(5);
  timer(25);
});

$(document).ready(function() {
  timer(5);
  timer(25);
});

function timer(countTo) {
  for (var iterations = 0; iterations < countTo; iterations++) {
    var time = 10; /* how long the timer runs for */
    var initialOffset = '440';
    var i = 1
    var interval = setInterval(function() {
      $('.circle_animation').css('stroke-dashoffset', initialOffset - (i * (initialOffset / countTo)));
      $('h2').text(i);
      if (i == countTo) {
        clearInterval(interval);
      }

    }, 1000);
    timer();
    console.log("Iteration:", iterations + 1);
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

希望这有帮助! :)