jQuery, функция animate(), рекурсия
Здравствуйте!
Есть некая игра (что-то наподобе шахмат), для которой на jQuery пишу "плейер". Плейер предназначен для того, чтобы показывать "запись" игры. Игра на двух человек, сначала ходит фигура одного игрока, потом другого, и т.д. Плейеру скармливаются все ходы в игре, он в соответствие с этими ходами перемещает фигуры на экране. Перемещение фигур должно поисходить так: движется одна фигура, когда она закончила движение, должна перемещаться следующая, и т.д. В jQuery есть функция animate(), в последнем параметре которой можно указать "конечную" функцию, которая вызывается в конце движения фигуры. Я могу указывать в качестве конечной функции метод начала обработки нового шага, next_step() например. Но, у меня складывается впечатление, что это создаст рекурсию. Так как в next_step() снова будет вызвана animate() для следующей фигуры, и т.д. Помню, что совсем недавно в браузерах были какие-то ограничения на глубину стека вызовов. То ли 64, толи 100. А в моей игре возможно и 500 ходов и более. Всвязи с вышеизложенным, вопросы: 1. Действительно ли в вышеописанном случае будет рекурсия? 2. Какие ограничения в JavaScript на стек вызовов в современных браузерах? 3. Как организовать плейер так, чтобы небыло рекурсии? У меня есть предположение сделать машину состояний, и в качестве конечной функции для animate() указать метод, переключащий некий флаг в состояние "ход закончен". Но тогда надо организовывать основной цикл, который будет отслеживать флаги, а его можно организовать только через setTimeout(), что даже при обработке 10 раз в секунду может дать большую нагрузку на браузер. То есть, мне бы хотелось просто вызывать обработку следующего хода в момент, когда движение фигуры на текущем ходе закончено. Как это сделать? |
Цитата:
Рекурсия здесь даже если и есть, то по всей логике она должна быть хвостовой. Не говоря уже о том, что callback будет вызван в другой момент времени (setTimeout / setInterval постарается), когда функция, начавшая анимацию, будет уже давным-давно выполнена. |
> Возьмите и посмотрите. Код jQuery открыт.
Можно было и не отвечать, коль вы не знаете ответа. |
Цитата:
Цитата:
|
Цитата:
Получается, что если вызов "конечной" функции идет с помощью обработчика очереди, то рекурсии быть не должно. То есть, просто при вызове animation() с конечной функцией, в очередь помещается "команда" движения объекта, а после нее "команда" вызова конечной функции, и код выполняется дальше. В параллель начинает движение объект, а при завершении движения вызовется конечная функция (возможно не сразу, а при очередном вызове jQuery.ready, который является Main Loop для всего jQuery). Правильно ли я понял, что рекурсии не будет? |
Цитата:
|
Очередь используется только для анимаций (и то, если таковых назначено несколько) все операции, работающие с данными и не подразумевающие асинхронности выполняются незамедлительно. Сама анимация же происходит последовательным вызовом "функции-шага", которая проводит необходимые преобразования. Очереди в чистом виде здесь нет, но что-то похожее есть. Вызов callback'а же происходит на последнем шаге, когда дальше "шагать" уже некуда.
Цитата:
|
Рекурсии не будет. Остальные вопросы отпадают.
|
Цитата:
|
Цитата:
xintrea, 1) у тебя будет непрерывная анимация в 500 шагов? 2) из чего сложилось твое впечатление? Цитата:
|
Часовой пояс GMT +3, время: 11:55. |