Проблема, которую вы наблюдаете, вызвана однопоточностью javascript. Тайм-ауты не выполняются во время выполнения существующего кода. Веб-работники были введены, чтобы иметь дело только с этим типом ограничения. Если вы не можете использовать веб-работников (например, из-за ограничений IE), использование тайм-аутов - единственный способ эмулировать многопоточность.
Чтобы проверить это, вы можете заменить строку на update(count++, L.length, f.length, phi.length)()
и изменить update
, чтобы записывать значения в консоль.
Что касается текущей реализации обновления, я предполагаю, что либо внутри jquery есть какие-то мини-таймеры, вызывающие проблему, либо возможности рендеринга в браузере просто по какой-то причине недоступны:).
Причина в том, что ваши расчеты и чертежи занимают гораздо меньше времени, чем время ожидания. Поэтому к тому времени, когда выполняются функции тайм-аута, все уже прорисовано.
Вы можете проверить это, заменив строку на update(count++, L.length, f.length, phi.length)()
- это приведет к мгновенному обновлению до 100%.
Чтобы получить более точную работу с индикатором выполнения, вы должны пересмотреть свой код расчета и попробовать переписать его в виде фрагментов. Я имею в виду возможность выполнять расчеты по частям и обновлять индикатор выполнения в конце каждой части. Сделав это, вы можете использовать таймер для оценки всего.
Пример:
(function(){
var arr = [1,2,3,4];
(function popLog(){
console.log(arr.pop());
if (arr.length > 0){
setTimeout(popLog, 100);
}
})();
})()
Другой подход - использование веб-работников , время от времени запрашивающих статус и соответствующим образом обновляющих индикатор выполнения. Однако IE не поддерживает их.