Използване на цикъл за задаване на множество изчаквания за дадена функция

Използвам Moment.js за обработка на времето. 10 Inning обекти (продължителности) са правилно дефинирани с начален и краен час, както е показано в този въпрос е JSFiddle.

Този скрипт е предназначен да използва разликата между край време и настояще за дефиниране на необходимото Timeout, което да бъде зададено, за да бъде извикана функция endInning(). Това се изпълнява в рамките на цикъл за обработка на 10-те ининга.

for (x = 0; x < 10; x++) { // for each of ten defined innings

    // calculate the difference between the end of inning x and now
    timeTillEnd = moment(Game.innings[x].start).diff(moment(now),"milliseconds");

    // and set the necessary delay
    setTimeout(function () { 
        endInning(x);
    }, timeTillEnd);

}

Въпреки това, вместо да доведе до забавяния, които се увеличават с 12 часа, всяко забавяне е едно и също.


Резултатът:

  • Завършва Ининг 1 в петък, 12:00 ч., 412712000 ms от сега.

  • Завършва Ининг 2 в петък, 12:00 ч., 412712000 ms от сега.

  • Завършва Ининг 3 в петък, 12:00 ч., 412712000 ms от сега.

  • ...и така нататък до 10-ти ининг.


Каква е моята грешка и как мога да я поправя?


Редакции:

След като зададох въпроси, свързани с моите практики с този скрипт, смятам, че тези въпроси / отговори са свързани:

И така въпросът ми става: Как мога да приложа тази практика за моята конкретна ситуация?


person Community    schedule 30.03.2014    source източник


Отговори (2)


Действителният проблем с крайните дати не принадлежи на изчакванията (това обаче все още е проблем с тях)

първо - създадохте един inning обект, докато трябва да създадете 10

така че, движете се

var inning = new Object();

вътре в първия for цикъл, по този начин ще създадете 10 inning обекта вместо един.

второ - злоупотребили сте с библиотечен обект moment

inning.start = beginning.moment.add("hours", (inningHours * x)); //WRONG

вие току-що променихте променлива begin.moment, което не е това, което се опитвате да постигнете!

В javascript всички обекти се предават чрез препратки https://stackoverflow.com/a/16880456/870183

Така че трябва да създадете нов моментен обект и след това да го промените.

inning.start = moment(beginning.moment).add("hours", (inningHours * x)); //correct

трето - проблем с изчакване. За всяко изчакване трябва да създадем друга функция с друга променлива x

Затварянията бяха трудни за разбиране за мен, така че продължавайте да опитвате. https://stackoverflow.com/a/111200/870183

Нека създадем функция, която ще върне друга функция

function endInningFunc(x){
    return function () {
        endInning(x)
    }
}

и след това ще предадем нова функция, където x ще бъде „заключен“ към своята стойност към setTimeout

setTimeout(endInningFunc(x), timeTillEnd);

последно нещо, не използвайте глобални променливи! http://www.webdevelopersnotes.com/tutorials/javascript/global_local_variables_scope_javascript.php3

например for (var x=0);

накрая, работният пример. http://jsfiddle.net/LmuX6/13/

person Sanya_Zol    schedule 02.04.2014
comment
Отговорът на Akshay предостави необходимата информация, но този я предоставя с много допълнителна помощ. Благодаря ви за отделеното време. - person ; 03.04.2014

function doSetTimeout(i) {
  setTimeout(function() { alert(i); }, 100);
}

for (var i = 1; i <= 2; ++i) {
  doSetTimeout(i);
}

го копирах от setTimeout във for-loop не отпечатва последователно стойности Няма да го използвам, ако цикля твърде много, тъй като всяко извикване на функция създава нов функционален обект и ще бъде интензивно памет, ако циклите твърде много, алтернативата би била да се създаде структура, подобна на клас. пример http://www.phpied.com/3-ways-to-define-a-javascript-class/

function Inning(x) {
    this.x= x;
}

Inning.prototype.onTimeOut = function() {
    // do your thing with this.x
};
person Akshay Ransing    schedule 02.04.2014