jQuery, функция animate(), рекурсия

xintrea

Новичок
Здравствуйте!


Есть некая игра (что-то наподобе шахмат), для которой на jQuery пишу "плейер". Плейер предназначен для того, чтобы показывать "запись" игры. Игра на двух человек, сначала ходит фигура одного игрока, потом другого, и т.д. Плейеру скармливаются все ходы в игре, он в соответствие с этими ходами перемещает фигуры на экране.

Перемещение фигур должно поисходить так: движется одна фигура, и когда она закончила движение, должна перемещаться следующая фигура, и т.д.

В jQuery есть функция animate(), в последнем параметре которой можно указать "конечную" функцию, которая вызывается в конце движения фигуры. Я могу указывать в качестве конечной функции метод начала обработки нового шага, next_step() например.

Но, у меня складывается впечатление, что это создаст рекурсию. Так как в next_step() снова будет вызвана animate() для следующей фигуры, и т.д. Помню, что совсем недавно в браузерах были какие-то ограничения на глубину стека вызовов. То ли 64, толи 100. А в моей игре возможно и 500 ходов и более.


Всвязи с вышеизложенным, вопросы:

1. Действительно ли в вышеописанном случае будет рекурсия?

2. Какие ограничения в JavaScript на стек вызовов в современных браузерах?

3. Как организовать плейер так, чтобы небыло рекурсии? У меня есть предположение сделать машину состояний, и в качестве конечной функции для animate() указать метод, переключащий некий флаг в состояние "ход закончен". Но тогда надо организовывать основной цикл, который будет отслеживать флаги, а его можно организовать только через setTimeout(), что даже при обработке 10 раз в секунду может дать большую нагрузку на браузер.


То есть, мне бы хотелось просто вызывать обработку следующего хода в момент, когда движение фигуры на текущем ходе закончено. Как это сделать?
 

xintrea

Новичок
Кстати, вы так и не сказали, будет ли рекурсия, если из "конечной" функции, установленной в animate(), снова будет вызываться animate() с той же "конечной" функцией.

Если вызов "конечной" функции идет с помощью обработчика очереди, то рекурсии вроде как быть не должно. То есть, просто при вызове animation() с конечной функцией, в очередь помещается "команда" движения объекта, а после нее "команда" вызова конечной функции, и код выполняется дальше. В параллель начинает движение объект, а при завершении движения вызовется конечная функция. Правильно ли я понял? В документации и по вашим ссылкам эта тонкость вроде как не описывается.
 

AmdY

Пью пиво
Команда форума
xintrea
все врут. © Хаус.
Проверь сам, это же не сложно эмулировать.
 

wc3banderlog

Новичок
Как я понял, есть массив данных размеров в количество шагов. ЧТо мешает открыть цикл и выполнять на каждом шаге соответствующие действия, каждый раз вызывая animate()?
 

tz-lom

Продвинутый новичок
wc3banderlog
сам попробуй сначала так сделать
 

wc3banderlog

Новичок
wc3banderlog
сам попробуй сначала так сделать
ПО сути я сказал то же, что и автор вопроса.
Но тогда надо организовывать основной цикл, который будет отслеживать флаги, а его можно организовать только через setTimeout(), что даже при обработке 10 раз в секунду может дать большую нагрузку на браузер.
А почему будет возникать нагрузка?
 
Сверху