Sobes.tech
Middle

Ako vytvoriť vlákno Web Worker v JavaScript?

sobes.tech AI

Odpoveď od AI

Pre vytvorenie Web Worker v JavaScripte sa používa konštruktor Worker, ktorý prijíma cestu ku skriptu, ktorý sa vykonáva v samostatnom vlákne.

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

Skript pracovníka (worker.js) sa vykonáva v inom globálnom kontexte, ktorý nemá prístup k DOM alebo k globálnemu objektu window. Na výmenu dát medzi hlavným skriptom a pracovníkom sa používajú metódy postMessage() a spracovateľ udalostí onmessage.

V hlavnom skripte:

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

// Odoslanie dát pracovníkovi
worker.postMessage({ data: 'Ahoj z hlavného vlákna!' });

// Spracovanie správ od pracovníka
worker.onmessage = function(event) {
  console.log('Prijaté od pracovníka:', event.data);
};

// Spracovanie chýb pracovníka (nepovinné)
worker.onerror = function(error) {
  console.error('Chyba v pracovníkovi:', error);
};

// Ukončenie práce pracovníka
// worker.terminate();

V skripte pracovníka (worker.js):

// Spracovanie správ od hlavného vlákna
self.onmessage = function(event) {
  console.log('Prijaté v pracovníkovi:', event.data);

  // Vykonanie dlhodobej operácie (príklad!)
  let result = 0;
  for (let i = 0; i < 1000000000; i++) {
    result += i;
  }

  // Odoslanie výsledku späť do hlavného vlákna
  self.postMessage({ result: result, originalData: event.data });
};

// Spracovanie chýb vo vnútri pracovníka (nepovinné)
self.onerror = function(error) {
  console.error('Chyba v pracovníkovi:', error);
};

// Pracovník môže importovať iné skripty
// importScripts('utils.js', 'helper.js');

Web Workers umožňujú presunúť výpočty náročné na zdroje do samostatného vlákna, čím sa zabraňuje blokovaniu hlavného vlákna používateľského rozhrania a zlepšuje sa odozva aplikácie. Je potrebné vziať do úvahy obmedzenia: pracovníci nemajú priame prístupy k DOM, window, document, localStorage alebo sessionStorage. Výmena dát sa vykonáva kopírovaním hodnôt alebo použitím objektov Transferable na zvýšenie výkonu pri prenose veľkých objemov dát.