Sobes.tech
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ługi onmessage.
  • Ograniczenia: Workery nie mają dostępu do DOM, obiektu window i innych globalnych obiektów przeglądarki. Mają ograniczony dostęp do navigator, location, XMLHttpRequest, setTimeout, setInterval, fetch, WebSockets i 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.