Frage

Ich habe eine bestimmte Seite, auf der viele Widgets verwendet werden, die von JavaScript -Routinen initialisiert werden müssen (ca. 400, es ist eine komplexe). Dies dauert einige Zeit (sogar 20 Sekunden auf langsameren Maschinen). Jetzt dachte ich, ich könnte einen Fortschrittsindikator (ein einfaches Textfeld mit einem prozentualen Etikett) anstelle der Seite zeigen, aber ich stellte fest, dass die laufenden Aufgaben alles, selbst wenn ich es kontinuent aktualisiert habe, alles blockiert und ich keine Aktualisierungen sehe. Also bleibt alles eingefroren, bis die schwere JavaScript -Aufgabe abgeschlossen ist. Ich habe sogar das folgende Experiment durchgeführt, aber auch gefriert (und Firefox sagt, dass das Drehbuch zu lange dauert, um zu vervollständigen ...):

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

Die einzige Lösung, die zu mir kommt, besteht darin, den langen Job in Stücken aufzubrechen und das Etikett zu aktualisieren ... aber ich habe mich gefragt, ob es eine andere Lösung gibt! Gott, JS braucht so schnell wie möglich Themen ... :)

Irgendwelche Ideen?

War es hilfreich?

Lösung

Kann ich davon ausgehen, dass die Skripte aus einem Onload -Ereignis ausgeführt werden, damit der Benutzer nicht auf einer leeren Seite sitzt, während er ausgeführt wird?

Wenn ja, würde ich empfehlen, die Skripte in separate Funktionen zu zerlegen, ein Array dieser Funktionen zu erstellen, dieses Array durchzusetzen und die Funktionen zu bewerten und Ihre Fortschrittsanzeige nach jedem N -Funktionen zu aktualisieren.

Und wenn es sich um eine öffentlich ausgerichtete Website handelt, versuchen Sie, die Menge an JavaScript zu minimieren, die unbedingt erforderlich ist, um die Seite zu erleben. Und die Initialisierung, die jedes Widget benötigt. Um Agent Smith zu paraphrasieren: Was nützt es, mit Akkordbäumen ausgestattet zu sein, wenn niemand darauf wartet, sie zu sehen?

Andere Tipps

Wenn Sie Threads wünschen, können Sie LiveConnect verwenden und echte Java -Threads erstellen (wenn der Sicherheitsmanager dies zulässt).

Wenn Sie nicht das Coroutines -Designmuster von C verwenden können.

Grüße.

Dies funktioniert, es wird angenommen, dass Sie B anrufen müssen, um es zu starten, und ein DIV mit ID = "Pip" zu haben.

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top