Faceci. To zegar. Chcę uruchomić timer i kiedy to się kończy zrobić coś innego (jak ostrzeżenie), a następnie uruchom ponownie z inną ilością minut. Ale nie mogę powodować zawsze tylko drugie połączenie:

$(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();
}

Jakie jest najlepsze rozwiązanie? Jest coś, czego nie rozumiem ... i tak bardzo!

0
Igua95 2 lipiec 2017, 23:24

5 odpowiedzi

Najlepsza odpowiedź
timer(5,timer(25));

Rozpoczyna się dwa zegarów i przechodzi wynik drugiego ( niezdefiniowany ) do pierwszego połączenia zwrotnego. Chcesz:

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

A wywołanie zwrotne musi zostać wykonane, jeśli i == Countto ...

0
Jonas Wilms 2 lipiec 2017, 20:31

Zamiast uruchamiać callback(), musisz uruchomić funkcję sama (timer()). Będziesz musiał również uruchomić pętlę for wewnątrz swojej funkcji, która sprawdza, ile razy funkcja już uruchomiona. Jeśli osiągnie pożądaną maksimum, wyrwaj z tego. W ten sposób nie będzie działać w nieskończoność.

W poniższym przykładzie funkcja timer() wykonuje pięć razy, co jest tym, co przyjmuję, że chcesz dzwonić 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>

Aby uruchomić funkcję 25 razy po tym, wszystko, co musisz zrobić, to połączenie timer(25) bezpośrednio po 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>

Mam nadzieję że to pomoże! :)

0
Obsidian Age 2 lipiec 2017, 20:34

Twój problem jest tutaj:

timer(5,timer(25));

Powinieneś wpisać

timer(5, function(){
  timer(25)
});
//or using ES6 syntax
timer(5, () => timer(25));

Ponieważ timer(25) zwraca swoją wartość (ta funkcja nie zwraca wartości, aby stara się wywołać niezdefiniowane), a nie tej funkcji. Przeczytaj również o zamknięciach, może być pomocne.

0
Reski 2 lipiec 2017, 20:32

Czy to jest to, czego chcesz?

timer(5,function(){timer(25)});
0
Joaozinho das Couves 2 lipiec 2017, 20:30

Cóż, po raz pierwszy:

timer(5,timer(25));

Jeśli myślisz, że ta linia zostanie wykonana timer(5), a następnie na końcu timer(5) Wykonuje timer(25), mylisz się. W rzeczywistości zamierza ocenę timer(25) natychmiast i przekazać swoją wartość powrotną (undefined) jako drugi parametr do timer(5,undefined).

Jeśli zamierzasz przekazać to jako zwrotny, musisz przejść funkcję. Więc możesz zrobić:

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

Ale w tej sprawie, nawet nie sprawdzasz, czy callback istnieje przed próbą wywołania go, więc prawdopodobnie otrzymujesz błąd odniesienia.

1
PMV 2 lipiec 2017, 20:31