• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] Teils asynchrone, teils synchrone Ausführung

mikdoe

Moderator
Trotz einiger Recherche und ein paar Versuchen mit div. JS und jQuery Varianten z. B. mit promise oder .done() oder .when() etc. habe ich nirgendwo das raus bekommen was ich haben möchte.

Die Frage ist: Wie kann man die Funktionen a(), b() und c() parallel und ende() erst dann starten, wenn a(), b() und c() fertig sind?

Die Lösung soll so sein, dass an der derzeitigen Syntax der Funktionsaufrufe nichts geändert werden braucht, also auch keine Callback Parameter hinzufügen etc.

Folgender Code:
HTML:
<!DOCTYPE html>
<html>
	<head>
		<title>Test teils asynchrone, teils synchrone Ausführung</title>
		<meta charset="utf-8">
	</head>
	<body>
		<div>
Frage:<br>
------<br>
Wie kann man die Funktionen a(), b() und c() parallel und ende() erst dann starten, wenn a(), b() und c() fertig sind?<br>
<br>
Es soll das ausgegeben werden:<br>
<br>
Funktion B trödelt<br>
Funktion C<br>
Funktion A langsam<br>
Funktion B fertig<br>
Funktionen ENDE<br>
<br>
Danke!<br>
<hr>
		</div>
		<div id="einfuege"></div>
		<script>
			"use strict";
			function a() {
				window.setTimeout(function() {
						document.getElementById('einfuege').innerHTML += 'Funktion A langsam<br>';
					},1000
				);
			}
			function b() {
				document.getElementById('einfuege').innerHTML += 'Funktion B trödelt<br>';
				window.setTimeout(function() {
						document.getElementById('einfuege').innerHTML += 'Funktion B fertig<br>'
					},2000
				);
			}
			function c() {
				document.getElementById('einfuege').innerHTML += 'Funktion C<br>';
			}
			function ende() {
				document.getElementById('einfuege').innerHTML += 'Funktionen ENDE<br>';
			}
			a();
			b();
			c();
			ende();
		</script>
	</body>
</html>
Ein Stichwort würde mir erstmal reichen, dann gurgle ich mal danach.
Danke!
 
Zuletzt bearbeitet:
warum kein callback
wenn du b() in a() u c() in b() und ende() in c() inline in der timerfunction aufrufst ginge das

dann brauchst du nur a(); und alles läuft von alleine .

Code:
	<script>
			"use strict";
			function a() {
				window.setTimeout(function() {
						document.getElementById('einfuege').innerHTML += 'Funktion A langsam<br>';b();
					},1000
				);
			}
			function b() {
				document.getElementById('einfuege').innerHTML += 'Funktion B trödelt<br>';
				window.setTimeout(function() {
						document.getElementById('einfuege').innerHTML += 'Funktion B fertig<br>';c();
					},2000
				);
			}
			function c() {
				document.getElementById('einfuege').innerHTML += 'Funktion C<br>';ende();
			}
			function ende() {
				document.getElementById('einfuege').innerHTML += 'Funktionen ENDE<br>';
			}
			a();
		//	b();
		//	c();
		//	ende();
		</script>
 
die sollen ja eben nicht einzeln aufeinander warten sondern möglichst alle gleichzeitig starten.
nur der letzte soll warten bis alle fertig sind, das ist das wichtigste dabei.
 
da steht keine unterstützung des IE. gibt es andere lösungen für alle browser? gern auch jquery.

Oder hast du da XHRs/JSONP oder wirklich Timeouts im Spiel? Dann kannst du mit Promises arbeiten.
Nö das war nur als beispiel.

Meine aktuelle anwendung ist, das eine webseite durch viele functions aufgebaut wird. und am ende muss die seite zu einer bestimmten stelle gescrollt werden. deshalb darf der letzte job mit dem scroll kommando erst starten wenn die anderen alle fertig sind.

und außerdem möchte ich das thema synchrone/asynchrone Ausführung lernen. im moment weiß ich nämlich z. b. überhaupt nicht, wie die tatsache mit dem einen thread mit asynchronität zusammen passt. ich würde jetzt erwarten, für die asynchrone ausführung zweier sachen auch zwei threads zu benötigen :confused:
 
Und wenn du mitzählst bis Zähler gleich Anzahl Funktionen dann ende
Code:
		<script>
			"use strict";

			function a() {
				window.setTimeout(function() {
						document.getElementById('einfuege').innerHTML += 'Funktion A langsam<br>';ende();////
					},1000
				);
			}
			function b() {
				document.getElementById('einfuege').innerHTML += 'Funktion B trödelt<br>';
				window.setTimeout(function() {
						document.getElementById('einfuege').innerHTML += 'Funktion B fertig<br>';ende();/////
					},2000
				);
			}
			function c() {
				document.getElementById('einfuege').innerHTML += 'Funktion C<br>'; ende();/////
			}
			function ende() {
				ende.count = ++ende.count || 1 // ende.count is undefined at first
				if(ende.count === 3){document.getElementById('einfuege').innerHTML += 'Funktionen ENDE<br>';}
			}
	
			a();
			b();
			c();
		</script>
 
Zuletzt bearbeitet von einem Moderator:
Und wenn du mitzählst bis Zähler gleich Anzahl Funktionen dann ende
das ist aber nur ne krücke und mit promises nicht mehr nötig

Trotz einiger Recherche und ein paar Versuchen mit div. JS und jQuery Varianten z. B. mit promise oder .done() oder .when() etc. habe ich nirgendwo das raus bekommen was ich haben möchte.
ok, when hattest du auch schon
Code:
<script>
			"use strict";
      var d1 = $.Deferred();
      var d2 = $.Deferred(); 
      var d3 = $.Deferred(); 
			function a() {
				window.setTimeout(function() {
						document.getElementById('einfuege').innerHTML += 'Funktion A langsam<br>';
						d1.resolve();
					},1000
				);
			}
			function b() {
				document.getElementById('einfuege').innerHTML += 'Funktion B trödelt<br>';
				window.setTimeout(function() {
						document.getElementById('einfuege').innerHTML += 'Funktion B fertig<br>';
						d2.resolve();
					},2000
				);
			}
			function c() {
				document.getElementById('einfuege').innerHTML += 'Funktion C<br>';
				d3.resolve();
			}
			$.when(d1, d2, d3).done(function()
			{
        ende();
      });
			function ende() {
				document.getElementById('einfuege').innerHTML += 'Funktionen ENDE<br>';
			}
			a();
			b();
			c();
		</script>
 
ok, when hattest du auch schon
danke für den vorschlag. Sieht gut aus!

meine fragen:
  1. wie behebt man ReferenceError: $ is not defined?
  2. wofür steht das $?
  3. wieso zeigt es die ausgabe sofort? die zeiten aus setTimeout werden garnicht abgewartet bis resolve obwohl es im callback steht. warum?
 
Fertige Lösung muss ich noch nachreichen:
HTML:
<!DOCTYPE html>
<html>
	<head>
		<title>Test teils asynchrone, teils synchrone Ausführung</title>
		<meta charset="utf-8">
		<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
	</head>
	<body>
		<div>
Frage:<br>
------<br>
Wie kann man die Funktionen a(), b() und c() parallel und ende() erst dann starten, wenn a(), b() und c() fertig sind?<br>
<br>
Es soll das ausgegeben werden:<br>
<br>
Funktion B trödelt<br>
Funktion C<br>
Funktion A langsam<br>
Funktion B fertig<br>
Funktionen ENDE<br>
<br>
Danke!<br>
<hr>
		</div>
		<div id="einfuege"></div>
		<script>
			"use strict";
			var d1 = jQuery.Deferred();
			var d2 = jQuery.Deferred(); 
			var d3 = jQuery.Deferred(); 
			function a() {
				window.setTimeout(function() {
						document.getElementById('einfuege').innerHTML += 'Funktion A langsam<br>';
						d1.resolve();
					},1000
				);
			}
			function b() {
				document.getElementById('einfuege').innerHTML += 'Funktion B trödelt<br>';
				window.setTimeout(function() {
						document.getElementById('einfuege').innerHTML += 'Funktion B fertig<br>';
						d2.resolve();
					},2000
				);
			}
			function c() {
				document.getElementById('einfuege').innerHTML += 'Funktion C<br>';
				d3.resolve();
			}
			function ende() {
				document.getElementById('einfuege').innerHTML += 'Funktionen ENDE<br>';
			}
			a();
			b();
			c();
			jQuery.when(d1,d2,d3).done(function() {
				ende();
			});
		</script>
	</body>
</html>
 
Zurück
Oben