A couple of interactive widgets that simulate long-running operations in the browser to demonstrate the usefullness of WebWorkers in Angular.
Hosted using Github Pages at: https://sbwhitt.github.io/web-worker-demo/
- Multi-threading in the browser
- Best for long-running CPU intensive operations on the client side
- Operations that cannot easily be off-loaded onto the server
- Prevents UI from locking up while waiting on long synchronous operations
- HTTP requests better off handled using async/await, but workers do have access to
fetch
- Provide
Workerobject with JS script - All code/dependencies must be contained within a single file
- Worker does not have access to the original execution context
- No access to DOM/window
- Communicate between workers and main thread through the use of messages
- Define
onmessagehandler after declaring worker that handles worker output - Worker uses
postMessageto transmit data- Data transmitted by
postMessagemust be JSON object only, no function objects - Data is deep copied from worker to destination
- Data transmitted by
- Define
- Stop workers by calling
terminate - Errors within workers are handled by
onerrormessage handler
- Create new WebWorker file using the Angular CLI:
ng generate web-worker <name>- Output is
<name>.worker.ts - Also creates
tsconfig.worker.jsonwith settings for compiling worker ts file
- Output is
- Initialize worker with
new Worker(new URL('path/to/<name>.worker', import.meta.url))- Must use
import.meta.urlwhen importing worker file due to path changes during bundling
- Must use
- Angular packages all dependencies used by worker and creates contained script for worker
/// <reference lib="webworker" />
addEventListener('message', ({ data }) => {
const response = `worker response to ${data}`;
postMessage(response);
});
- Widely supported by major browsers
- Check for support and provide backup code using
if (!window.Worker) { /* worker-less code */ }
- https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers
- https://developer.mozilla.org/en-US/docs/Web/API/Worker
- https://developer.mozilla.org/en-US/docs/Web/API/Worker#browser_compatibility
- https://angular.dev/ecosystem/web-workers
- https://blog.logrocket.com/real-time-processing-web-workers/
- https://medium.com/codex/web-workers-in-angular-99fc4dac1d40
- Reinforcement Learning applied to TicTacToe
- Implemented using QLearning
- Train Learner on a specific number of games
- Learner converges after playing ~60,000 games with the current setup
- Exponential time algorithm to find Nth Fibonacci number
- Very slow