Middle
Jak utworzyć wątek Web Worker w JavaScript?
sobes.tech AI
Odpowiedź od AI
Utworzenie wątku Web Worker w JavaScript można wykonać za pomocą konstruktora Worker.
// Tworzymy nowego Web Workera, przekazując ścieżkę do pliku JS,
// który będzie wykonywany w osobnym wątku.
const worker = new Worker('worker.js');
W pliku worker.js (lub innym wskazanym podczas tworzenia workera) kod będzie wykonywał się w osobnym wątku.
// worker.js
// Obsługa wiadomości wysyłanych z głównego wątku
self.onmessage = function(event) {
const receivedData = event.data;
console.log('Odebrano wiadomość od głównego wątku:', receivedData);
// Wysyłanie wiadomości z powrotem do głównego wątku
const responseData = { message: 'Cześć od Workera!', data: receivedData };
self.postMessage(responseData);
};
// Opcjonalnie można dodać obsługę błędów
self.onerror = function(error) {
console.error('Błąd w Workerze:', error);
};
W głównym wątku (gdzie został utworzony worker) można się z nim komunikować:
// main.js
const worker = new Worker('worker.js');
// Wysyłanie wiadomości do Web Workera
worker.postMessage({ command: 'start', payload: 'some data' });
// Obsługa wiadomości otrzymanych od Web Workera
worker.onmessage = function(event) {
const receivedData = event.data;
console.log('Odebrano wiadomość od Workera:', receivedData);
};
// Obsługa błędów w Web Workerze
worker.onerror = function(error) {
console.error('Błąd Workera w głównym wątku:', error);
};
// Zakończenie Web Workera (opcjonalnie)
// worker.terminate();
Kluczowe punkty:
- Komunikacja: Wymiana danych między głównym wątkiem a workerem odbywa się za pomocą wiadomości, korzystając z metod
postMessage()i obsługionmessage. - Ograniczenia: Workery nie mają dostępu do DOM, obiektu
windowi innych globalnych obiektów przeglądarki. Mają ograniczony dostęp donavigator,location,XMLHttpRequest,setTimeout,setInterval,fetch,WebSocketsi innych. - Izolacja: Kod w workerze jest wykonywany w osobnym wątku, co zapobiega blokowaniu głównego wątku i poprawia wydajność, szczególnie przy wykonywaniu obliczeń zasobożernych.