Web Worker Demo
Real-time demo showing UI responsiveness with background processing
Try Worker Demo
Progress Status:
Waiting for input...
Result will appear here
Main Thread (HTML)
const worker = new Worker(URL.createObjectURL(new Blob([
`'use strict';
onmessage = function(e) {
const numbers = e.data.numbers;
const result = numbers.reduce((acc, num) => acc + num, 0);
postMessage({ sum: result, duration: Date.now() - e.data.startTime });
};`
], { type: 'application/javascript' })));
document.getElementById('startWorker').addEventListener('click', () => {
const numbers = document.getElementById('inputNumbers').value
.split(',')
.map(Number)
.filter(n => !isNaN(n));
if (numbers.length > 0) {
document.getElementById('status').textContent = 'Processing...';
document.getElementById('result').className = "mt-4 h-32 bg-white/60 rounded-lg flex items-center justify-center text-gray-500 italic";
document.getElementById('result').textContent = 'Calculating...';
worker.postMessage({
numbers: numbers,
startTime: Date.now()
});
worker.onmessage = function(e) {
document.getElementById('status').innerHTML = `
✓ Completed in ${e.data.duration}ms
`;
document.getElementById('result').textContent = `Sum: ${e.data.sum}`;
};
}
});
Worker Thread Code
// Web Worker Script
onmessage = function(e) {
const numbers = e.data.numbers;
const result = numbers.reduce((acc, num) => acc + num, 0);
postMessage({
sum: result,
duration: Date.now() - e.data.startTime,
workerThreadId: self.threadId // Simulated thread ID
});
};
Technical Demo
🟢
Main Thread
Responsive
🟡
Worker Thread
Active
🟠
Shared Memory
Safe Access
This demo shows how web workers keep the UI responsive by offloading computation
Try typing a large number of values (10000+) to see the worker handle it smoothly
Why Web Workers Matter
Before Workers
for (let i = 0; i < 1000000000; i++) {
// Synchronous calculation
}
Main thread blocks for ~5 seconds
With Workers
const worker = new Worker('sum-worker.js');
worker.postMessage([1,2,3,4,5]);
worker.onmessage = function(result) {
console.log('Completed in', result.duration);
};
UI stays responsive