Javascript 2
Aus ProgrammingWiki
Wissen | Können | Projekt |
---|---|---|
|
|
|
Asynchrone Verarbeitung
Bereits in den vorangegangenen Kapiteln wurde asynchron programmiert. Javascript im Allgemeinen und jQuery im Speziellen nutzen diese Technik intensivst. Das Ziel ist die Ausführung von Code auf den Moment zu verschieben wo sie erforderlich ist und trotzdem den Code an den Stellen zu schreiben wo er inhaltlich hingehört.
Die Codezeile $("#id").click(function(){alert("Klick");}); umfasst zwei Funktionsaufrufe (click und alert). Wenn die Ausführung der Funktion click abgeschlossen ist, wurde die Funktion alert noch nicht ausgeführt. Syntaktisch ähnlich ist die Zeile [1,2].forEach(function(){alert("iterate");}); mit den Funktionsaufrufen forEach und alert. Hier wird alert vor dem Ende der Funktion forEach aufgerufen (synchron). Der Unterschied liegt also in der verwendeten Funktion und ob diese die übergebene Funktion asynchron ausführt oder nicht.
Basis der asynchronen Programmierung in Javascript ist die Funktion setTimeout. Bei Ausführung der Funktion wird die übergebene Callback-Funktion nur in einer Warteschlange platziert. Dahinter folgende Funktionen werden direkt im Anschluss ausgeführt bis die programmierte Funktion vollständig abgearbeitet wurde. Erst nach Ablauf der eingestellten Wartezeit (ab dem Zeitpunkt des Aufrufs von setTimeout) wird die Callback-Funktion vom Browser aufgerufen.
|
|
Unter Verwendung von setTimeout können in Javascript eigene Funktionen geschrieben werden die Callback-Funktionen asynchron ausführen. Das erlaubt z.B. Animationen zu erzeugen indem die Bewegungen stückweise in kurzen Zeitabständen ausgelöst werden. Aber auch bei länger dauernden Funktionen ist es notwendig dem Browser die Möglichkeit zu geben zwischenzeitlich zu reagieren. Durch das Single-Threading blockiert prinzipiell jede aktive Ausführung von Code den Browser. Länger andauernde Blockaden enden mit einem Timeout der unbedingt zu verhindern ist.
|
|
Webworker
Die bessere Alternative zur Ausführung langer Operationen sind Webworker. Diese sind die einzige Möglichkeit Funktionalitäten in eigenständige Threads auszulagern. Der Haupthread steht damit über die gesamte Ausführungszeit für Browserreaktionen zur Verfügung. Die Webworker-Verarbeitung erfolgt nebenläufig. Die Kommunikation zwischen Worker und Haupthread erfolgt über Messages. Mit postMessage werden Daten gesendet und durch Definition der Callback-Funktion onMessage können Daten emfangen werden.
|
|
Projekt und weitere Übungen
Erweitern Sie das Sudoku um einen Sekundenzähler welcher beim Start eines neuen Sudokus bei 0 beginnt und stoppt wenn das Sudoku komplett und richtig ausgefüllt ist. Setzen Sie die o.g. Hilfsfunktionen um und lagern Sie den Sekundenzähler in einen Webworker aus.
Beispiellösung![]() | WE1-P7.zip (0.1 MB) |
- Machen Sie sich mit loupe vertraut und experimentieren Sie mit dem vorgegebenen Code-Beispiel. Loupe is a little visualisation to help you understand how JavaScript's call stack/event loop/callback queue interact with each other.
- Entwickeln Sie eine Webanwendung wie in folgender Abbildung:
unter Berücksichtigung der folgenden Anleitung:
Nach dem Laden der Webseite wird das aktuelle Datum mit Uhrzeit angezeigt und permanent automatisch aktualisiert. Zur Umsetzung verwenden Sie reines Javascript (single thread, asynchron). Mit dem Knopf "Timer/Worker starten" wird ein (HTML5-)WebWorker eingerichtet, dessen Auftrag darin besteht, einen Timer (Zählergenerator) mit 0 zu starten. Dieser kann mit "Timer unterbrechen" temporär gestoppt und mit "Timer fortsetzen" mit dem aktuellen Zählerstand fortgesetzt werden. "Worker zerstören" stoppt den Zähler dauerhaft und beendet im Hintergund auch die Existenz des WebWorkers. Nur mit "Timer/Worker starten" kann die Kommunikation fortgesetzt werden.
Hinweis: Generator.html, workerLogic.js - Entwickeln Sie eine kleine Webanwendung, die Daten aus einer vorbereiteten MySQL-Datenbank abfragt und in die Webseite (DOM) einbaut. Verwenden Sie den DB-Server aus XAMPP. Orientieren Sie sich an folgendem Skript: http://www.thegeekstuff.com/2014/01/mysql-nodejs-intro/. Wählen Sie Ihr Beispiel so, dass die mit asynchronem DB-Zugriff verbundenen Aspekte (Vorteile, Probleme) deutlich werden.