Ваша функция be_busy фактически никогда не входит в цикл while, чтобы быть занятым в течение 100 мс.Вам нужно перевернуть <
на >
или >=
.Так что эти пропуски просто из-за задержек в вашем браузере, которые немного отстают от времени.Но на самом деле эти задержки незначительны, если у вас есть должная занятая функция.Если вы щелкнете по знаку, вы получите следующее: http://jsfiddle.net/Paulpro/PvQFh/40/embedded/result/
Ожидается, что он будет пропускать блоки таким образом, потому что Javascript является однопоточным.Таким образом, ваш первый вызов refresh_ui произойдет через 50 мс.Ваш следующий через 100 мс.И вы должны увидеть, что первые два блока установлены активными.
Затем при 120 мс вызывается be_busy, и он удерживает поток в течение 100 мс.поэтому refresh_ui не может быть вызван (независимо от того, используете ли вы setTimeout или setInterval, этот факт не меняется) до 220 мс.refresh_ui будет вызван на 220, и вы увидите, что третий блок активен.Затем в 240 мс be_busy будет вызван снова.Поэтому следующее обновление не может происходить до 340 мс.Когда это произойдет, 5-й блок будет активирован в (340/80 = 4.x).
Пропущенный четвертый блок - ожидаемое поведение в лучших браузерах.Браузер, который не пропускает этот блок, вероятно, отстает еще больше.
Таким образом, вы должны раскрасить первые три блока, затем белый прямоугольник, затем 2 красных, затем белый и т. Д. И каждые 10 групп по двав красных блоках будет один белый блок.
Единственный реальный способ обойти это - разбить be_busy на кучу более мелких функций, которые разбивают работу на части, или использовать Web Workers для выполнения фоновой (занятой) обработки, но Web Workers будут работать только в самых последних браузерах.