Мониторинг длинной задачи в Javascript - PullRequest
0 голосов
/ 15 июля 2009

У меня есть определенная страница, которая использует множество виджетов, которые должны быть инициализированы подпрограммами Javascript (около 400, это сложный). Это занимает некоторое время (даже 20 секунд на медленных машинах). Теперь я думал, что смогу показать индикатор прогресса (простое текстовое поле с процентной меткой) вместо страницы, но обнаружил, что даже если я обновляю его постоянно, текущая задача блокирует все, и я не вижу обновлений. Таким образом, все остается замороженным, пока тяжелая задача javascript не будет завершена. Я даже выполнил следующий эксперимент, но тоже зависает (и Firefox говорит, что выполнение сценария занимает слишком много времени ...):

function a(){
    for (var i = 0; i < 5000000000000000; i++){
        abb = i;        
    }
}

var abb;

function c(){
    var ef = document.getElementById("pip");
    ef.innerHTML = abb;

}

function b(){

    setInterval(c, 50);
    setTimeout(a, 1000);
}

Единственное решение, которое приходит ко мне, это разбить длинную работу на части и обновить этикетку .... но мне было интересно, есть ли другое решение! Боже, JS нужны темы как можно скорее ...:)

Есть идеи?

Ответы [ 3 ]

1 голос
/ 15 июля 2009

Можно ли предположить, что сценарии выполняются из события onLoad, чтобы пользователь не сидел на пустой странице во время его выполнения?

Если да, то я бы порекомендовал разбить сценарии на отдельные функции, создать массив этих функций, выполнить итерацию по этому массиву и оценить функции, а также обновлять индикатор выполнения после каждой функции N.

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

0 голосов
/ 15 июля 2009

Это работает, предполагается, что вам нужно вызвать b, чтобы запустить его и получить div с id = "pip"

<html>
<head>
    <script type="text/javascript">

    var i;
    var state = 0;

    function a(){

        switch(state){

        case 0:
            i = 0;
        case 1:
            i++;
            for (; i < 5000000000000000; i++){
                abb = i;
                if (i%1000 == 0){
                    setTimeout(a, 1);
                    state = 1;              
                    return;             
                }                   
            }
        break;
        }
    }

    var abb;

    function c(){
        var ef = document.getElementById("pip");
        ef.innerHTML = abb;

    }

    function b(){

        setInterval(c, 50);
        setTimeout(a, 1000);
    }

    </script>
</head>
<body onload="javascript:b();">
    <div id = "pip">test</div>
</body>
</html>
0 голосов
/ 15 июля 2009

Если вам нужны потоки, вы можете использовать LiveConnect и создавать настоящие потоки Java (если менеджер безопасности это позволяет).

Если вы не можете использовать шаблон проектирования сопрограмм C.

Привет.

...