Web Worker: eine Möglichkeit, Skripte im Hintergrund in einem anderen Thread als dem aktuellen Hauptthread (Fenster) auszuführen.
JavaScript verarbeitet normalerweise asynchrone Vorgänge, indem es Aufgaben in entsprechende Warteschlangen stellt (Makro-Aufgaben-Warteschlange, Mikro-Aufgaben-Warteschlange), wobei die Ereignisschleife diese Warteschlangen kontinuierlich überprüft und Aufgaben in den Aufrufstapel schiebt, wenn sie zur Ausführung bereit sind. Dieser Ansatz gewährleistet eine nicht blockierende Ausführung, führt aber dennoch alles in einem einzigen Thread aus.
Web Worker hingegen ermöglichen die Ausführung von Skripten in einem völlig separaten Thread mit eigenem Aufrufstapel, asynchronen Warteschlangen und Ereignisschleife. Diese Trennung verhindert, dass der Hauptthread durch schwere Berechnungen oder lang laufende Aufgaben blockiert wird, da der Worker unabhängig arbeitet.
Web-Worker führen Skripte in einem anderen Kontext als dem Hauptfensterkontext aus und ermöglichen so Parallelität in Webanwendungen. Die Web Worker API bietet verschiedene Arten von Workern:
Dieser Artikel konzentriert sich auf engagierte Worker, die am einfachsten zu implementieren sind und am häufigsten verwendet werden.
Um einen Web-Worker zu erstellen, können Sie die folgenden Schlüsselmethoden verwenden:
Lassen Sie uns einen Worker erstellen, um Daten von einer API abzurufen, insbesondere Hundebilder von der Dog CEO API.
Hier ist die Implementierung des Worker-Skripts. Beachten Sie, dass self innerhalb des Workers verwendet wird, um auf den globalen Kontext zu verweisen:
if (window.Worker) { const worker = new Worker("/src/worker.js"); worker.postMessage({ operation: "get_dog_imgs", url: "https://dog.ceo/api/breeds/image/random", count: 5 //number of photos }); worker.onmessage = (e) => { console.log(e.data); if (e && e.data) { setdata((old) => [...old, e.data]); // update react state showCallStack(); // function to show the callstack } }; worker.onerror = (e) => { console.log(e); }; }
In diesem Code lauscht der Worker auf Nachrichten (onmessage) und ruft Daten von der angegebenen URL mehrmals ab, wie durch die Anzahl angegeben.
So sieht der Aufrufstapel im Worker aus:
Der Hauptthread verwendet den Worker wie folgt:
self.onmessage = (event) => { const data = event.data; if (data && data.url && data.count) { fetchFromUrls(data.url, data.count); } } // fetch single data const fetchdata = async (url) => { const res = await self.fetch(url); return await res.json(); }; const fetchFromUrls = async (url, count) => { showCallStack(); // showing the callstack of the worker for (const i of new Array(count).fill(0)) { let data = await fetchdata(url); if (data && data.message) { self.postMessage({ type: "img", data: data.message }); } } };
Dieser Code zeigt, wie man eine Nachricht an den Worker sendet und die abgerufenen Daten im Hauptthread empfängt.
Für den vollständigen Code gehen Sie zu Code
Während Web-Worker in einem separaten Thread vom Hauptfenster-Thread ausgeführt werden, unterliegen sie bestimmten Einschränkungen:
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3