Краткое описание - Ваш первый метод не будет работать (это будет просто бесконечный цикл), и механизм опроса (хотя его можно заставить работать) никогда не является «предпочтительным» выбором.
Javascript является однопоточным (за некоторыми исключениями, такими как webWorkers, но они здесь не применяются), так как пока цикл while работает, никакая другая JS не может запускаться, что может изменить значение animationComplete
, чтобы вы могли бесконечный цикл, который никогда не будет завершен (в конце концов браузер будет жаловаться на то, что поток JS не завершил и предоставил пользователю возможность остановить скрипт).
Правильный способ узнать, когда завершена анимация, - использовать обратный вызов для завершения анимации. Если вы используете jQuery, то все анимации jQuery имеют обратный вызов завершения, который вы можете передать, и он будет вызван, когда анимация будет выполнена. Затем вы помещаете код, который вы хотите выполнить после анимации в этой функции обратного вызова.
Если вы используете анимацию CSS3, вы можете зарегистрировать обработчик событий для события transitionend
и получить обратный вызов таким образом, когда анимация будет завершена.
Если вы хотите опросить значение переменной, то использование таймера для опроса будет подходящим выбором, так как это позволяет запускать другой код, который может фактически изменить переменную.
Я должен добавить, что опрос, подобный этому, редко является лучшим выбором дизайна. Если это анимация, вы просто хотите использовать событие завершения анимации, поэтому опрос не требуется. Если по какой-то причине вы используете функцию анимации, которая не имеет встроенного события завершения, то, вероятно, стоит изменить этот код, чтобы включить такой обратный вызов, который всегда будет возможен и, очевидно, полезна.
Для нас, чтобы обеспечить более подробные рекомендации, мы должны были бы знать больше о коде анимации и то, что вы пытаетесь сделать. Как я уже говорил, все анимации jQuery обеспечивают обе возможности и поддержку обратного вызова для уведомления о завершении (вы отметили вопрос jQuery, почему я упоминаю об этом).
Отсутствие обещаний в любом интерфейсе не является основанием для того, чтобы не использовать обратные вызовы завершения, так что факт здесь не имеет особого значения, и любая данная функция также может быть продемонстирована (превратите обычный обратный вызов в интерфейс обещания), если обещания желаемый способ взаимодействия с асинхронными событиями.
Попробуйте пользовательское событие или паб/sub. Вероятно, это идеальный вариант в этой ситуации. – colecmc
«Поскольку будущее/обещание недоступно в текущей версии Javascript ...» Задача языка не предоставлять фьючерсы/обещания/события для его библиотек. Это задача библиотек. –