2009-07-15 12 views
0

Ich habe eine bestimmte Seite, die viele Widgets verwendet, die von Javascript-Routinen (etwa 400, es ist eine komplexe) initialisiert werden müssen. Dies dauert einige Zeit (sogar 20 Sekunden auf langsameren Rechnern). Jetzt dachte ich, ich könnte einen Fortschrittsanzeiger (ein einfaches Textfeld mit einer prozentualen Bezeichnung) anstelle der Seite zeigen, aber ich entdeckte, dass die laufende Aufgabe, auch wenn ich sie kontinuierlich aktualisierte, alles blockiert und ich keine Aktualisierungen sehe. So bleibt alles eingefroren, bis die schwere Javascript-Aufgabe abgeschlossen ist. Ich habe sogar das folgende Experiment durchgeführt, sondern friert auch (und Firefox sagt, dass das Skript zu lange dauert abzuschließen ...):Eine lange Aufgabe in Javascript überwachen

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, ist die lange Arbeit zu brechen in Stücke und update das Etikett .... aber ich frage mich, ob es eine andere Lösung gibt! Gott, JS braucht so schnell wie möglich Themen ... :)

Irgendwelche Ideen?

Antwort

1

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

Wenn ja, dann würde ich empfehlen, die Skripte in separate Funktionen zu zerlegen, ein Array dieser Funktionen zu erstellen, dieses Array zu durchlaufen und die Funktionen auszuwerten sowie die Fortschrittsanzeige nach jeder N-Funktion zu aktualisieren.

Und wenn es eine öffentlich zugängliche Website ist, versuchen Sie, die Menge an JavaScript zu minimieren, die absolut notwendig ist, um die Seite zu erleben. Und die Menge an Initialisierung, die jedes Widget benötigt. Um Agent Smith zu paraphrasieren: Was nützen Akkolfaltenbäume, wenn niemand darauf wartet, sie zu sehen?

+0

+1 Natürlich! Ich denke darüber nach, wenn alles andere fehlschlägt – ATorras

+0

Ihre Lösung wird leider nicht funktionieren. Der Grund dafür ist, dass bis zur Rückkehr der langen Jobfunktion, selbst wenn sie andere anruft, nichts aktualisiert wird (zumindest bei FF). Der einzige Weg ist, eine globale Variable zu behalten, und so weitermachen: - Dinge von 1 bis 20, Update-Zähler, setTimeout (wie 1ms, nur um Vorvermehrung) mit Funktion dann Rückkehr - beim Rückruf, Dinge zu tun von 21 bis 40, setTimeout und so weiter ... Ich denke, das ist der einzige Weg, um diese Arbeit richtig zu bekommen, das heißt, Timesharing zu emulieren. – gotch4

+0

... was genau die Lösung ist, die ich beschrieben habe – kdgregory

0

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

Wenn nicht, können Sie das Entwurfsmuster von C verwenden.

Grüße.

0

Dies funktioniert, wird es angenommen, Sie b müssen nennen es zu starten und ein div mit id haben = „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> 
Verwandte Themen