Nakładanie się interwałów

0

Witam, usiłuję w js zmusić skrypt, aby funkcja setInterval miała różne wartości milisekund w zależności od spełnionego warunku. Mam następujący kod:

        if (s>=46) {
		predkosc6=200;
	} else if ((s<46)&&(s>=35)) {
		predkosc6=50;
	} else {
		predkosc6=10;
	}
	stoper6 = setInterval('spadek2()',predkosc6);

Generalnie problem polega na tym, że interwały się na siebie nakładają, a zależy mi na tym, żeby w przedziale <x,46> była jedna stała wartość, w następnym przedziale inna, w kolejnym jeszcze inna. Jak sobie z tym poradzić?

0

To znaczy, chcesz aby tylko jedna funkcja interwałowa działała w określonym przez Ciebie przedziale?

0

Jeśli dobrze zrozumiałem to tak. Chodzi mi o to, że funkcja interwałowa kiedy s jest w przedziale <x,46> ma wartosc 200, w (46,35> 50 itd.

0

coś takiego miało być?

    if (s >= 46) {
        predkosc6=200;
    } else if (s >= 35) {
        predkosc6=50;
    } else {
        predkosc6=10;
    }

nie musisz w drugim przypadku (na 35) sprawdzać czy s<46, bo to jest oczywiste, skoro program dotarł do tego miejsca.

0
Azarien napisał(a):

coś takiego miało być?

    if (s >= 46) {
        predkosc6=200;
    } else if (s >= 35) {
        predkosc6=50;
    } else {
        predkosc6=10;
    }

nie musisz w drugim przypadku (na 35) sprawdzać czy s<46, bo to jest oczywiste, skoro program dotarł do tego miejsca.

A czym to się różni od mojego kodu? Poza tym warunek z koniunkcją moim zdaniem jest konieczny, bo "s" będący większy lub równy 46 będzie jednocześnie spełniał warunek s>=35 ;)

0

@Azarien, kod tak fajny, ale wymaga domyślania się dlaczego drugi if działa. To nie do końca jest fajne.

@Kadobe, z takimi problemami dobrze sobie poradzić nie za pomocą if/else, ale "gołych" ifów. Przynajmniej na początek, by później zamienić to na coś w rodzaju:

function over(value, minimum, action, timeout){
      if(value >= minimum)
          setInterval(action ,timeout);
}

function under(value, max, action, timeout){
      if(value<max)
          setInterval(action ,timeout);
}

function between(value, min, max, action, timeout){
      if(value>=min && value<max)
          setInterval(action ,timeout);
}
//...

over(...)
between(...)
under(...)

Z dokładnością do warunków granicznych. Taki układ jest łatwiejszy do przetestowania i nie tak zagmatwany jak ciąg if else. Zasada nr 1 jak tworzysz kod warunkowy - rozbij go na niezależne i minimalistyczne funkcje/metody. Przetestujesz je osobno i w razie czego wyłapiesz błędy.

0

Efekt jest taki sam jak z if'ami. Chodzi o to, że wartość "s" na bieżąco maleje i interwały się nakładają x razy w czasie kiedy spełniony jest dany warunek...

0

OK, już rozumiem w czym problem. Jak wywołujesz setInterval to należy przypisać wynik tej metody do jakiejś zmiennej i przed utworzeniem nowego interwału zatrzymać poprzedni:

var currentInterval; 
//.....
function between(value, min, max, action, timeout){
      if(value>=min && value<max){
          clearInterval(currentInterval);
          currentInterval  = setInterval(action ,timeout);
      }
}
0

Hmm, teraz jest problem następujący klikając na przycisk start uruchamiam funkcję odliczającą

stoper1 = setInterval('liczczas()', 1000);

, w tej funkcji liczczas dodałem overy, betweeny i undery i jak można się domyślić ich odliczanie pokrywa się z 1000 milisekund liczczas(). Czy jest na to jakiś sposób?

1 użytkowników online, w tym zalogowanych: 0, gości: 1