2012-08-22 15 views
7

Wywołuję wiele setTimeout w pętli javascript. Opóźnienie jest obecnie ustawione na zwiększenie o 200ms po każdej iteracji, co powoduje, że funkcja "self.turnpages()" uruchamia się co 200ms.Stosowanie łagodzenia opóźnień setTimeout w pętli

Chciałbym jednak zastosować pewnego rodzaju łagodzenie tych zmiennych opóźnień, aby w miarę jak pętla zaczęła osiągać kilka ostatnich iteracji, opóźnienie ulegało dalszemu rozdzieleniu, powodując zwolnienie funkcji.

var self = this;  
var time = 0; 

for(var i = hide, len = diff; i < len; i++) { 
        (function(s){ 
          setTimeout(function(){      
             self.turnPages(s);       
          }, time); 
         })(i);         
      time = (time+200); 
} 

Mam całkowitą stratę, od czego zacząć.

Mam nadzieję, że ktoś może pomóc.

+2

Zamiast 200 jest stały, powinien być funkcją „I”. – Pointy

+0

@Pointy - Rzeczywiście jednak nie mam pojęcia, od czego zacząć matematyka, aby osiągnąć to, czego potrzebuję. – gordyr

+1

Cóż, zależy to od tego, jak chcesz wyglądać krzywą dynamiki. – Pointy

Odpowiedz

9

To brzmi jak praca dla płynnych równań Roberta Pennera! Możesz pobrać oryginalne wersje ActionScript 2.0 here (po prostu usuń silne wpisywanie parametrów w celu przeniesienia do JavaScript) i istnieje dobre wyjaśnienie parametrów here.

Coś jak poniżej będą robić to, co chcesz (fiddle):

var time = 0; 
var diff = 30; 

var minTime = 0; 
var maxTime = 1000; 

// http://upshots.org/actionscript/jsas-understanding-easing 
/* 
    @t is the current time (or position) of the tween. This can be seconds or frames, steps, seconds, ms, whatever – as long as the unit is the same as is used for the total time [3]. 
    @b is the beginning value of the property. 
    @c is the change between the beginning and destination value of the property. 
    @d is the total time of the tween. 
*/ 
function easeInOutQuad(t, b, c, d) { 
    if ((t /= d/2) < 1) return c/2 * t * t + b; 
    return -c/2 * ((--t) * (t - 2) - 1) + b; 
} 

function easeOutQuad(t, b, c, d) { 
    return -c * (t /= d) * (t - 2) + b; 
} 

function easeInQuad(t, b, c, d) { 
    return c * (t /= d) * t + b; 
} 

for (var i = 0, len = diff; i <= len; i++) { 
    (function(s) { 
    setTimeout(function() { 
     //self.turnPages(s);       
     console.log("Page " + s + " turned"); 
    }, time); 
    })(i); 

    time = easeInOutQuad(i, minTime, maxTime, diff); 
    console.log(time); 
} 
+0

absolutnie doskonały. Dziękuję – gordyr

+0

Bez problemu gordyr, happy easing! –