Sobes.tech
Middle

Cum se creează un fir Web Worker în JavaScript?

sobes.tech AI

Răspuns de la AI

Crearea unui thread Web Worker în JavaScript se poate face folosind constructorul Worker.

// Creăm un nou Web Worker, transmitând calea către fișierul JS,
// care va fi executat într-un thread separat.
const worker = new Worker('worker.js'); 

În fișierul worker.js (sau orice alt fișier specificat la crearea worker-ului) va fi executat codul într-un thread separat.

// worker.js

// Procesarea mesajelor trimise din thread-ul principal
self.onmessage = function(event) {
  const receivedData = event.data;
  console.log('Mesaj primit de la thread-ul principal:', receivedData);

  // Trimiterea mesajului înapoi în thread-ul principal
  const responseData = { message: 'Salut de la Worker!', data: receivedData };
  self.postMessage(responseData);
};

// Opțional, se poate adăuga gestionarea erorilor
self.onerror = function(error) {
  console.error('Eroare în Worker:', error);
};

În thread-ul principal (unde a fost creat worker-ul), se poate interacționa cu acesta:

// main.js

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

// Trimiterea unui mesaj către Web Worker
worker.postMessage({ command: 'start', payload: 'some data' });

// Procesarea mesajelor primite de la Web Worker
worker.onmessage = function(event) {
  const receivedData = event.data;
  console.log('Mesaj primit de la Worker:', receivedData);
};

// Gestionarea erorilor în Web Worker
worker.onerror = function(error) {
  console.error('Eroare în Worker în thread-ul principal:', error);
};

// Închiderea Web Worker (opțional)
// worker.terminate(); 

Puncte cheie:

  • Comunicare: Schimbul de date între thread-ul principal și worker se face prin mesaje folosind metodele postMessage() și handler-ul onmessage.
  • Limitări: Worker-ii nu au acces la DOM, obiectul window și alte obiecte globale ale browser-ului. Ei au acces limitat la navigator, location, XMLHttpRequest, setTimeout, setInterval, fetch, WebSockets și altele.
  • Izolare: Codul din worker rulează într-un thread separat, prevenind blocarea thread-ului principal și îmbunătățind performanța, mai ales în cazul calculelor intensive în resurse.