Джефф обрисовал в общих чертах один подход (используя setInterval
и очистив его от обратного вызова), поэтому я выделю другой: использование setTimeout
для обратного вызова.Что-то вроде
m = 10
do drawCallback = ->
draw m, 150
m += 10
setTimeout drawCallback, 1000 unless m > 100
Обратите внимание, что между этими двумя подходами есть небольшая разница во времени: setInterval func, 1000
будет запускать функцию один раз каждые 1000 мс;цепочка setTimeout
устанавливает задержку 1000 мс между каждым вызовом функции.Так что если бы draw
потребовалось 100 мс, скажем, цепочка setTimeout
была бы эквивалентна setInterval func, 1100
.Это, вероятно, не имеет значения, но о нем стоит знать.
Бонусный подход : у вас нет , чтобы отказаться от цикла;вы можете просто установить все таймауты из него сразу:
for m in [10..100] by 10
do (m) ->
setTimeout (-> draw(m, 150)), 100 * m
do (m)
необходим, чтобы при закрытии, переданном в setTimeout
, было видно каждое значение m
, а не только его окончательное значение впетля.См. Мою статью Вмешательство CoffeeScript для получения дополнительной информации об этом.
Наконец : Сначала я знаю, что все это кажется очень запутанным, но время в JS на самом деле очень простопотому что язык однопоточный.Это означает, что события, которые вы запланировали с помощью setTimeout
или setInterval
или любой другой асинхронной функции, никогда не произойдут во время цикла, даже если цикл бесконечный.Они появляются только после того, как весь ваш код завершит выполнение.Об этом я немного подробнее расскажу в моей книге о CoffeeScript .