Ein Web-Worker ist ein JavaScript, das im Hintergrund ausgeführt wird, ohne die Leistung der Seite zu beeinträchtigen.
Beim Ausführen von Skripten auf einer HTML-Seite reagiert die Seite nicht mehr, bis das Skript abgeschlossen ist.
Ein Web-Worker ist ein JavaScript, das unabhängig im Hintergrund ausgeführt wird anderer Skripte, ohne die Leistung der Seite zu beeinträchtigen. Sie können weiterhin tun und lassen, was Sie wollen: Klicken, Auswählen von Dingen usw., während der Web-Worker im Hintergrund läuft.
Die Zahlen in der Tabelle geben die ersten Browserversionen an, die Web Worker vollständig unterstützen:
Chrome 4 | IE 10 | Firefox 3.5 | Safari 4 | Opera 11.5 |
Jan 2010 | Sep 2012 | Jun 2009 | Jun 2009 | Jun 2011 |
Das folgende Beispiel erstellt einen einfachen Web-Worker, der im Hintergrund Zahlen zählt:
Probieren Sie es selbst aus →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Web Workers API</h2>
<p>Count numbers: <output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<script>
let w;
function startWorker() {
if(typeof(w) == "undefined") {
w = new Worker("demo_workers.js");
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
};
}
function stopWorker() {
w.terminate();
w = undefined;
}
</script>
</body>
</html>
if (typeof(Worker) !== "undefined") {
// Yes! Web worker support!
// Some code.....
}
else {
// Sorry! No Web Worker support..
}
Lassen Sie uns nun unseren Web-Worker in einem externen JavaScript erstellen.
Hier erstellen wir ein Skript, das zählt. Das Skript ist in der Datei „demo_workers.js“ gespeichert:
let i = 0;
function timedCount()
{
i ++;
postMessage(i);
setTimeout("timedCount()",500);
}
timedCount();
Der wichtige Teil des obigen Codes ist die Methode postMessage()
- mit der eine Nachricht zurück auf die HTML-Seite gesendet wird.
Hinweis: Normalerweise werden Web-Worker nicht für solch einfache Skripte verwendet, sondern für CPU-intensivere Aufgaben.
Da wir nun die Web-Worker-Datei haben, müssen wir sie von einer HTML-Seite aus aufrufen.
Die folgenden Zeilen prüfen, ob der Worker bereits vorhanden ist. Wenn nicht, wird ein neues Web-Worker-Objekt erstellt und der Code ausgeführt „demo_workers.js“:
if (typeof(w) == "undefined") {
w = new Worker("demo_workers.js");
}
Dann können wir Nachrichten vom Web-Worker senden und empfangen.
Fügen Sie dem Web Worker einen „onmessage“-Ereignis-Listener hinzu.
w.onmessage = function(event){
document.getElementById("result").innerHTML = event.data;
};
Wenn der Web-Worker eine Nachricht postet, wird der Code im Ereignis-Listener ausgeführt. Die Daten vom Web-Worker wird in event.data gespeichert.
Wenn ein Web-Worker-Objekt erstellt wird, wartet es weiterhin auf Nachrichten (auch nach Abschluss des externen Skripts), bis es beendet wird.
Um einen Web-Worker zu beenden und Browser-/Computerressourcen freizugeben, verwenden Sie die terminate()
Methode:
w.terminate();
Wenn Sie die Worker-Variable nach ihrer Beendigung auf undefiniert setzen, Sie können den Code wiederverwenden:
w = undefined;
Wir haben den Worker-Code bereits in der .js-Datei gesehen. Unten finden Sie den Code für die HTML-Seite:
<!DOCTYPE html>
<html>
<body>
<p>Count numbers: <output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<script>
let w;
function startWorker()
{
if (typeof(w) == "undefined") {
w = new Worker("demo_workers.js");
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
};
}
function stopWorker()
{
w.terminate();
w = undefined;
}
</script>
</body>
</html>
Probieren Sie es selbst aus →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Web Workers API</h2>
<p>Count numbers: <output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<script>
let w;
function startWorker() {
if(typeof(w) == "undefined") {
w = new Worker("demo_workers.js");
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
};
}
function stopWorker() {
w.terminate();
w = undefined;
}
</script>
</body>
</html>
Da sich Web-Worker in externen Dateien befinden, haben sie keinen Zugriff auf die folgenden JavaScript-Objekte:
Das Fensterobjekt
Das Dokumentobjekt
Das übergeordnete Objekt