JS und Multitasking

  • Themenstarter Themenstarter Lumakrieger
  • Beginndatum Beginndatum
Ja, wenn du setTimeout ausführst, so wird nicht gewartet, bis die Zeit abgelaufen ist, sondern die Funktion kehrt sofort zurück, und erst nach dem Timeout wird die angegeben Funktion aufgerufen.

Beispiel:
HTML:
function a() {
    window.setTimeout( function() { document.write( "eins" ); }, 1000 );
    document.write( "drei" );
}
function b() {
   document.write( "zwei" );
}

a();  b();

gibt "drei zwei eins" aus, da die Funktion setTimeout sofort zurück kehrt.

Ich glaube gelesen zu haben, dass JavaScript kein echtes Multithreading untersützt.
Beispiel:

HTML:
<html><body><div id='text'></div><script>

function write( text ) {
	document.getElementById( "text" ).innerHTML += text;
}

function a() {
    window.setTimeout( function() { write( "eins" ); }, 100 );
    write( "drei" );
}

function b() {
	var start = new Date().getTime();
	
	while( new Date().getTime() - start < 3000 )
		write( "zwei " );
}

a(); b();

</script></body></html>
Dieses Script gibt 3 Sekunden lang "zwei" aus, und soll nach 0.1sekunden "eins" ausgeben. Tut es aber nicht, es gibt "eins" erst aus, nachdem es 3 Sekunden lang "zwei" ausgegeben hat.
 
Ich glaube gelesen zu haben, dass JavaScript kein echtes Multithreading untersützt.
Beispiel:

HTML:
<html><body><div id='text'></div><script>

function write( text ) {
    document.getElementById( "text" ).innerHTML += text;
}

function a() {
    window.setTimeout( function() { write( "eins" ); }, 100 );
    write( "drei" );
}

function b() {
    var start = new Date().getTime();
    
    while( new Date().getTime() - start < 3000 )
        write( "zwei " );
}

a(); b();

</script></body></html>
Dieses Script gibt 3 Sekunden lang "zwei" aus, und soll nach 0.1sekunden "eins" ausgeben. Tut es aber nicht, es gibt "eins" erst aus, nachdem es 3 Sekunden lang "zwei" ausgegeben hat.

Das finde ich komisch. Also wartet das Timeout im Zweifelsfall, bis alle anderen Skripte fertig sind um dann auszuführen, was es soll.
Oh ich seh schon, ich hätte mit meinen komplexen Ajax Anwendungen warten sollen, ich programmiere in Javascript ja eigentlich erst seit 3 Wochen :mad:
 
Das finde ich garnicht so komisch, wenn man im Hinterkopf behält, dass Javascript nicht Multithread-Fähig ist.
Dann würde ich, wenn die ganzen im HTML definierten Scripte abgearbeitet sind eine Art EventLoop aufrufen, die prüft ob irgendwas angeklickt wurde (und dann die definierten Funktionen aufruft, und danach wieder in den EventLoop zurück geht), und guckt, ob irgendein Timeout abgelaufen ist (und dann die Funktion aufruft und danach erst wieder in den EventLoop zurück kehrt um zu gucken, ob vielleicht noch ein Timeout vorliegt.)
Im Mozilla gibt es, glaube ich, eine Javascript Klasse für Threads, die jedoch nur mit den Javascript Grund-Funktionen funktioniert. Hab damit damals nur den Firefox zum aufhängen gebracht, als ichs benutzt hab. =)
Gruß, Olli
 
Zurück