Web Workers and Threading
Running JavaScript in background threads
Challenge
Section titled “Challenge”Offload CPU-intensive tasks to background threads without blocking the UI.
Explanation
Section titled “Explanation”Web Workers allow long-running scripts to run in background threads without freezing the UI.
Creating a Worker
Section titled “Creating a Worker”const worker = new Worker('worker.js');
// Send message to workerworker.postMessage({ data: [1, 2, 3, 4, 5] });
// Receive result from workerworker.onmessage = (event) => { console.log('Result:', event.data);};
// Handle errorsworker.onerror = (error) => { console.error('Worker error:', error.message);};
// Terminate workerworker.terminate();self.onmessage = (event) => { const { data } = event; const result = data.map(n => n * n);
self.postMessage({ result });};Shared Worker
Section titled “Shared Worker”// Multiple pages sharing one workerconst sharedWorker = new SharedWorker('shared-worker.js');sharedWorker.port.start();
sharedWorker.port.postMessage({ message: 'hello' });sharedWorker.port.onmessage = (event) => { console.log('From worker:', event.data);};Use Cases
Section titled “Use Cases”// Heavy computationconst worker = new Worker('compute.js');
// Image processingconst imageWorker = new Worker('image-processor.js');imageWorker.postMessage({ imageData, width, height });
// Data parsingconst parserWorker = new Worker('parser.js');parserWorker.postMessage({ json: largeJson });
// Background pollingconst pollerWorker = new Worker('poller.js');pollerWorker.postMessage({ endpoint: '/api/updates', interval: 5000 });Transferable Objects
Section titled “Transferable Objects”// Transfer ownership instead of copyingconst arrayBuffer = new ArrayBuffer(1024);
// This transfers the buffer (doesn't copy)worker.postMessage({ buffer: arrayBuffer }, [arrayBuffer]);
// arrayBuffer is now empty in main thread// Worker has full ownershipLimitations
Section titled “Limitations”// Workers have limited access// ✅ Can use:// - postMessage// - setTimeout, setInterval// - navigator object// - XMLHttpRequest, fetch// - Worker constructor
// ❌ Cannot use:// - DOM manipulation// - window object properties// - alert, confirm// - document object
// Share data via messagesworker.postMessage({ type: 'update', data: newData });Practical Example
Section titled “Practical Example”function processLargeDataset(data) { return new Promise((resolve, reject) => { const worker = new Worker('processor.js');
worker.postMessage({ data });
worker.onmessage = (event) => { worker.terminate(); resolve(event.data); };
worker.onerror = (error) => { worker.terminate(); reject(error); }; });}
// Use itprocessLargeDataset(largeArray).then(result => { console.log('Processed:', result);});
// processor.jsself.onmessage = async (event) => { const { data } = event;
// Heavy processing const result = await process(data);
self.postMessage(result);};