Domanda

Ho una pagina particolare, che utilizza un sacco di widget che devono essere inizializzato da routine JavaScript (circa 400, si tratta di un problema complesso). Questo richiede un certo tempo (anche 20 secondi su macchine lente). Ora stavo pensando che potrei mostrare un indicatore di progresso (un semplice campo di testo con un'etichetta in percentuale), al posto della pagina, ma ho scoperto che anche se ero aggiornandolo continuamente, in corso blocchi compito tutto e non vedo gli aggiornamenti. Così tutto rimane congelato fino a quando il compito javascript pesante completata. Ho anche fatto il seguente esperimento, ma congela così (e Firefox dice che lo script sta impiegando troppo tempo per completare ...):

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);
}

L'unica soluzione che mi viene è quello di abbattere il lavoro a lungo in pezzi e aggiornare l'etichetta .... ma mi chiedevo se c'è un'altra soluzione! Dio, JS ha bisogno di discussioni il più presto possibile ...:)

Tutte le idee?

È stato utile?

Soluzione

Posso supporre che gli script vengono eseguiti da un evento onLoad, in modo che l'utente non è seduto a una pagina vuota durante l'esecuzione?

Se sì, allora vi consiglio di rompere gli script in funzioni distinte, creando una serie di quelle funzioni, scorrendo tale matrice e evaling le funzioni, e l'aggiornamento indicatore di avanzamento dopo ogni funzioni N.

E se si tratta di un sito Web pubblico, cercare di minimizzare la quantità di JavaScript che è assolutamente necessario per sperimentare la pagina. E la quantità di inizializzazione che ciascun widget ha bisogno. Per parafrasare agente Smith:? A cosa sono alberi fisarmonica-piega, se nessuno aspetta di vederli

Altri suggerimenti

Se si desidera è possibile utilizzare le discussioni LiveConnect e creare veri thread Java (se responsabile della sicurezza lo permette).

Se non è possibile utilizzare modello coroutine disegno di C.

Saluti.

Questo funziona, si presume hai avuto modo di chiamare b per avviare in su e hanno un div con 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top