Если вы пришли из фона языка/рамок/API, где вы могли бы приостановить исполнение с чем-то вроде Sleep
или процесса ввода данных пользователя синхронно с чем-то вроде DoEvents
, он не будет работать в JavaScript.
Невозможно заблокировать цикл событий JavaScript с чем-то вроде этого, по уважительной причине: отзывчивость пользовательского интерфейса. В JavaScript все асинхронно. Вы можете использовать setTimeout
, чтобы что-то сделать с событием таймера, но пользователь все еще может получить доступ к пользовательскому интерфейсу между событиями таймера или даже перейти от страницы.
Чтобы адресовать фрагмент кода, то, что вы ищете, называется асинхронным конечным автоматом. Это позволяет сохранить состояние кода между остановкой/продолжить (в вашем случае, это состояние анимации, хотя i
переменная является также частью):
(function()
{
var i = 0;
var nextStep = function()
{
if (i<10)
{
/* Animation Code */
i++;
setTimeout(nextStep, 500);
}
}
nextStep();
})();
Это будет намного проще закодировать, когда все браузеры поддерживают новый yield
ключевое слово:
http://pag.forbeslindesay.co.uk
на стороне записки, некоторые другие ответы предлагают использовать setInterval
. Существует тонкое, но важное различие между задержка и интервал. Задержка - это время между двумя этапами. Интервал - это время , так как начался предыдущий шаг. Если каждый шаг анимации занимает 200 мс, и вы используете интервал 500 мс, фактическая задержка между двумя шагами будет равна 300 мс, а не 500 мс, как ожидается.
_ «Тем не менее, это не похоже на работу» _ пожалуйста расширить, как она не работает –
Он работает ... это только ваш тайм-аут установлен в 50 миллисекунд вместо 500. – Brad
какой среде вы запуск этого кода? Это в браузере или где-то еще? ['setTimeout'] (http://mdn.beonex.com/en/DOM/window.setTimeout.html) на самом деле является частью DOM, а не самим JavaScript. Некоторые среды JavaScript обеспечивают собственную реализацию 'setTimeout', но не все это делают. –