Sobes.tech
Middle

Jak utworzyć wątek Web Worker w JavaScript?

sobes.tech AI

Odpowiedź od AI

Aby utworzyć Web Workera w JavaScript, używa się konstruktora Worker, który przyjmuje ścieżkę do skryptu wykonywanego w osobnym wątku.

const worker = new Worker('path/to/worker.js');

Skrypt workera (worker.js) jest wykonywany w innym kontekście globalnym, który nie ma dostępu do DOM ani do obiektu globalnego window. Do wymiany danych między głównym skryptem a workerem używa się metod postMessage() i obsługi zdarzeń onmessage.

W głównym skrypcie:

const worker = new Worker('worker.js');

// Wysyłanie danych do workera
worker.postMessage({ data: 'Cześć z głównego wątku!' });

// Obsługa wiadomości od workera
worker.onmessage = function(event) {
  console.log('Odebrano od workera:', event.data);
};

// Obsługa błędów workera (opcjonalnie)
worker.onerror = function(error) {
  console.error('Błąd w workerze:', error);
};

// Zakończenie pracy workera
// worker.terminate();

W skrypcie workera (worker.js):

// Obsługa wiadomości od głównego wątku
self.onmessage = function(event) {
  console.log('Odebrano w workerze:', event.data);

  // Wykonanie długotrwałej operacji (przykład!)
  let result = 0;
  for (let i = 0; i < 1000000000; i++) {
    result += i;
  }

  // Wysłanie wyniku z powrotem do głównego wątku
  self.postMessage({ result: result, originalData: event.data });
};

// Obsługa błędów wewnątrz workera (opcjonalnie)
self.onerror = function(error) {
  console.error('Błąd w workerze:', error);
};

// Worker może importować inne skrypty
// importScripts('utils.js', 'helper.js');

Web Workers pozwalają na przeniesienie obliczeń intensywnych do osobnego wątku, co zapobiega blokowaniu głównego wątku interfejsu użytkownika i poprawia responsywność aplikacji. Należy pamiętać o ograniczeniach: workery nie mają bezpośredniego dostępu do DOM, window, document, localStorage ani sessionStorage. Wymiana danych odbywa się przez kopiowanie wartości lub z użyciem obiektów Transferable, co zwiększa wydajność przy przesyłaniu dużych ilości danych.