Может кто-нибудь отладить проблему с индикатором выполнения в моем Javascript-апплете? - PullRequest
1 голос
/ 08 октября 2011

Вот апплет

Вы можете оставить все настройки как есть, а затем нажать «Рассчитать».Через несколько секунд вы увидите несколько графиков, затем индикатор выполнения под кнопкой «Рассчитать» заполнится до 100%.

Проблема в том, что я хочу, чтобы индикатор выполнения увеличивался, покакод выполняется, а не после того, как он завершен, поскольку построены графики.Я знаю, что код длинный, но вы можете найти следующий штрих-код:

setTimeout( update(count++, L.length, f.length, phi.length) );

Доступ к обновлению функции (s, x, y, z), которое определяется непосредственно перед основным вычислением ().

Я просто не понимаю, почему индикатор выполнения не обновляется, пока не завершится вся обработка.

Заранее спасибо!

1 Ответ

2 голосов
/ 08 октября 2011

Проблема, которую вы наблюдаете, вызвана однопоточностью 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 не поддерживает их.

...