LINUX.ORG.RU

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


0

1

Здравствуйте!


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

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

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

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


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

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

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

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


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


что даже при обработке 10 раз в секунду может дать большую нагрузку на браузер.

ну делают же люди на вебне всякие риалтаймовые игрушки, в т.ч. трехмерные, а там основной цикл с контролем фпс, - и всё равно оно вполне играбельно

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

То есть, вы не знаете, будет ли рекурсия при вызове animate()->конечная_функция()->animate()->конечная_функция() и т.д. ?

Насколько я понял, весь jQuery работает на основе очереди, и для каждого обрабатываемого селектора создается очередь. В очередь помещаются «команды», что нужно делать в данный момент времени и информация, на каком этапе находится выполнение «команды». Как только «команда» выполнена, она удаляется из очереди, и начинается выполнение следущей «команды».

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

xintrea
() автор топика
Ответ на: комментарий от xintrea

Что тут думать, проверь.

var i = 0;
var n = 0;
function x() {
  i++;
  n++;
  if (n>5) return;
  alert(i);
  $("#test").slideToggle("slow",x);
  i--;
}
x();

Писал наобум, если есть опечатки - исправь.

Если я ещё не совсем дурак, то в такой записи никакой рекурсии нет, всё же асинхронно. Где тут рекурсия?

ChALkeR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.