Here’s **more advanced JavaScript** — building directly on the previous
concepts (closures, prototypes, proxies, generators, event loop). We’ll cover
newer/more powerful topics with **real-life practical examples** you can use
in production apps (fintech dashboards, real-time trading tools, large-scale
React/Node apps, etc.).
### 6. Symbols & Well-Known Symbols – Unique Identifiers &
Metaprogramming
**Theory**: `Symbol()` creates a unique, immutable primitive that can’t be
accidentally overwritten. Useful for private-like properties (before `#` private
fields) and customizing object behavior via well-known symbols
(`[Link]`, `[Link]`, `[Link]`, etc.).
**Practical Example** – Safe Private Properties in a Portfolio Class (prevents
external code from clashing with internal state)
```js
const _balance = Symbol('balance'); // truly unique key
const _transactions = Symbol('transactions');
class CryptoPortfolio {
constructor() {
this[_balance] = 0;
this[_transactions] = [];
addTransaction(coin, amount, price) {
this[_transactions].push({ coin, amount, price, time: new Date() });
this[_balance] += amount * price;
}
getBalance() {
return this[_balance]; // controlled access
// Make it iterable with well-known Symbol
[[Link]]() {
let index = 0;
const txs = this[_transactions];
return {
next: () => ({
value: txs[index++],
done: index > [Link]
})
};
// Usage
const portfolio = new CryptoPortfolio();
[Link]('BTC', 0.5, 68000);
[Link]('ETH', 3, 3200);
[Link]('Balance:', [Link]());
for (const tx of portfolio) {
[Link]('Tx:', tx);
}
```
**Real-life use**: Libraries use symbols to avoid key collisions (e.g., Redux
action types, internal React keys). `[Link]` powers `for...of` on
custom objects; `[Link]` for async generators in streaming
APIs.
### 7. Iterators & Custom Async Iteration – Beyond Basic Loops
We already saw generators. Now combine with `for await...of` for clean
streaming.
**Practical Example** – Real-time Price Feed Processor (used in trading
dashboards or live crypto trackers)
```js
// Async iterable price feed (simulates WebSocket or polling)
async function* livePriceFeed(coins) {
for (const coin of coins) {
// In real app: fetch from WebSocket or API
const price = ([Link]() * 10000 + 60000).toFixed(2);
yield { coin, price: Number(price), timestamp: new Date().toISOString() };
await new Promise(r => setTimeout(r, 800)); // throttle
// Usage with for await...of (clean, no manual promise handling)
(async () => {
const feed = livePriceFeed(['BTC', 'ETH', 'SOL']);
for await (const update of feed) {
[Link](`📈 ${[Link]} @ $${[Link]}`);
// Here you could update UI, trigger alerts, etc.
})();
```
**Real-life use**: Infinite scrolling feeds, live stock/crypto tickers, processing
large paginated API responses without loading everything into memory.
### 8. Top-Level `await` (Modern Module Design)
**Theory**: In ES modules (`.mjs` or `<script type="module">`), you can
use `await` at the top level. No more wrapping everything in an IIFE.
**Practical Example** – Config Loading in a Real App (fintech or dashboard
startup)
```js
// [Link] (top-level await – huge in 2025/2026 codebases)
const apiBase = '[Link]
const userPrefs = await fetch('/api/user-preferences')
.then(r => [Link]())
.catch(() => ({ theme: 'dark', currency: 'USD' }));
export const config = {
apiBase,
currency: [Link],
theme: [Link]
};
// [Link]
import { config } from './[Link]';
[Link]('App starting with currency:', [Link]);
// No extra async wrapper needed!
```
**Real-life use**: Server-side rendering ([Link], Astro), configuration loading
in micro-frontends, and simplifying bootstrap code in large apps. Eliminates
many "async init" hacks.
### 9. Decorators (Stage 3 – Widely Used via Transpilers in 2026)
**Theory**: `@decorator` syntax for adding behavior to
classes/methods/fields without modifying core logic. Great for logging,
validation, memoization, authorization.
**Practical Example** (using current Stage 3 style – works in
TypeScript/Babel today; native coming soon)
```js
// Simple decorator factory
function logExecution(target, context) {
const originalMethod = target;
return function (...args) {
[Link](`Calling ${[Link]} with`, args);
const result = [Link](this, args);
[Link](`Result from ${[Link]}:`, result);
return result;
};
class PortfolioService {
@logExecution
calculateTotalValue(positions) {
return [Link]((sum, pos) => sum + [Link] * [Link], 0);
const service = new PortfolioService();
[Link]([
{ coin: 'BTC', amount: 0.5, price: 68200 },
{ coin: 'ETH', amount: 2, price: 3250 }
]);
```
**Real-life use**:
- In NestJS backends (controllers, guards, interceptors)
- React/Vue component decorators for lifecycle or state
- Authorization, rate-limiting, caching layers in enterprise apps
More advanced decorators can wrap entire classes or auto-bind methods.
### 10. Temporal API – The Long-Awaited Fix for Dates (Now Shipping in
2026)
**Theory**: `Temporal` replaces the flawed `Date` object with immutable,
timezone-aware, precise types (`[Link]`,
`[Link]`, etc.). No more mutability bugs or timezone
surprises.
**Practical Example** – Accurate Portfolio Performance Calculator (critical in
fintech)
```js
// Check support: if (typeof Temporal !== 'undefined')
const now = [Link]('Africa/Addis_Ababa'); // Your
timezone!
const purchaseDate = [Link]('2025-01-15');
const today = [Link]();
const daysHeld = [Link](today, { largestUnit: 'days' }).days;
[Link](`Held for ${daysHeld} days`);
// Precise duration calculation
const duration = [Link]({ days: 30, hours: 12 });
[Link]([Link]()); // "P30DT12H"
```
**Real-life use**: Any app dealing with financial dates, scheduling, calendars,
or user timezones. Bloomberg and many finance teams pushed for this. It’s
immutable by default → safer in concurrent code.
**Note**: As of early 2026, it’s available in Chrome 144+, Firefox 139+, with
polyfills for others.
### Performance & Memory: WeakRef & FinalizationRegistry
**Quick practical** – Prevent memory leaks in long-running apps (e.g.,
caching user portfolios):
```js
const cache = new Map();
const registry = new FinalizationRegistry((heldValue) => {
[Link](`Cleaning up cache for ${heldValue}`);
[Link](heldValue);
});
function getPortfolio(userId) {
if ([Link](userId)) return [Link](userId);
const portfolio = { /* heavy data */ };
[Link](userId, portfolio);
[Link](portfolio, userId); // auto-clean when GC runs
return portfolio;
```
Used in large SPAs to avoid memory bloat from stale caches.
---
### Next Steps – Let’s Build Something Real
All these concepts shine together. Want me to show:
1. **Full Crypto Portfolio Dashboard** integrating:
- Proxy for reactive state
- Temporal for accurate P&L dates
- Async generator for live price stream
- Decorators for logging/tracking
- Debounce on user input
- Top-level await for config
2. Deeper dive into **Web Workers + Comlink** for off-main-thread heavy
computation (price calculations without freezing UI)?
3. **Advanced Patterns**: Module federation, service workers for offline
crypto tracking, or error boundaries with proxies?
4. [Link] side: Streams + Async Iterators for processing large transaction
logs.
Reply with what you want to explore or build next — we can keep going step-
by-step with copy-pasteable code until you’re shipping production-grade
advanced JS confidently. 🚀
Which one excites you most right now? Or tell me your current project
(React? Node? Dashboard?) so I tailor the next examples perfectly.
**Deep Dive into the Temporal API (2026 Edition)**
The Temporal API is JavaScript’s long-awaited modern replacement for the
notoriously buggy `Date` object. After nearly 9 years of development
(championed by Bloomberg and others), it reached **Stage 4** in March
2026 and is now shipping natively in major browsers.
### Current Status (April 2026)
- **Native support**: Chrome 144+, Firefox 139+, Edge 144+.
- **Safari**: Partial in Technology Preview (full soon).
- **[Link]**: Available behind `--harmony-temporal` flag or via polyfill.
- **Production tip**: For full cross-browser support, use the official polyfill:
```bash
npm install @js-temporal/polyfill
```
Then: `import { Temporal } from '@js-temporal/polyfill';`
It’s **immutable**, **timezone-aware**, **precise to nanoseconds**, and
**calendar-flexible** — solving the biggest pain points of `Date`.
Here’s how the different Temporal types relate to each other (visual
overview):
### Why `Date` Was Broken (and Temporal Fixes It)
| Problem with `Date` | Temporal Solution |
|--------------------------------------|--------------------------------------------|
| Mutable (changes in place) | All objects are immutable |
| Timezone hell (local vs UTC) | Explicit `ZonedDateTime` or `Instant`
|
| Month is 0-based | 1-based, human-readable |
| No nanosecond precision | Built-in nanoseconds |
| DST & leap seconds handled poorly | Correct DST skipping & arithmetic
|
| Hard to do safe date math | `add()`, `subtract()`, `until()`, `since()` |
### Core Types – Explained with Real Code
#### 1. `[Link]` – Current Time (your starting point)
```js
const nowInAddis = [Link]('Africa/Addis_Ababa');
[Link]([Link]());
// e.g. "2026-04-03T14:54:22.123456789+03:00[Africa/Addis_Ababa]"
const plainToday = [Link](); // no timezone
const instantNow = [Link](); // UTC nanoseconds
```
#### 2. `[Link]` – A single point in universal time
Best for timestamps, logs, crypto trade executions.
```js
const tradeTime = [Link]('2026-04-
03T11:54:22.123456789Z');
[Link]([Link]); // BigInt precision
```
#### 3. `[Link]` – The hero for real apps
Includes timezone + calendar. Perfect for user-facing dates in Ethiopia or
global fintech.
```js
// Create from ISO string with explicit timezone
const purchase = [Link]({
year: 2025,
month: 12,
day: 15,
hour: 10,
minute: 30,
timeZone: 'Africa/Addis_Ababa'
});
// Or from string (RFC 9557 format)
const sale = [Link]('2026-04-
03T14:00:00+03:00[Africa/Addis_Ababa]');
// DST-safe arithmetic (handles skipped hours automatically)
const oneHourLater = [Link]({ hours: 1 });
[Link]([Link]());
// → correctly becomes 15:00, never 14:00 if DST skips it
```
#### 4. Plain Types (no timezone – great for birthdays, schedules)
```js
const birthDate = [Link]('1995-08-23');
const meetingTime = [Link]('2026-04-10T09:00:00');
const justTime = [Link]('14:30:00');
```
#### 5. `[Link]` – The math engine
```js
const holdingPeriod = [Link](sale, { largestUnit: 'days' });
[Link]([Link]()); // "P110DT3H30M"
[Link]([Link]); // 110
// Create custom duration
const oneWeek = [Link]({ days: 7, hours: 12 });
const future = [Link](oneWeek);
```
### Practical Real-Life Example: Crypto Portfolio Tracker (Tying Back to Our
Series)
Let’s build a **holding period & P&L calculator** using everything we learned
earlier (closures, Proxy reactivity, Temporal).
```js
// 1. Reactive portfolio with Temporal dates
const portfolio = new Proxy({
positions: [
coin: 'BTC',
amount: 0.5,
buyPrice: 62000,
buyDate: [Link]('2025-12-
15T10:30:00+03:00[Africa/Addis_Ababa]')
}, {
set(target, prop, value) {
if (prop === 'positions') {
[Link](pos => {
// Auto-calculate current holding duration
const now = [Link]('Africa/Addis_Ababa');
[Link] = [Link](now, { largestUnit: 'days' }).days;
[Link] = [Link] * 68200; // mock price
[Link] = ([Link] - ([Link] * [Link]));
});
target[prop] = value;
[Link]('🔄 Portfolio updated with fresh Temporal calculations');
return true;
});
// 2. Usage
[Link][0].amount = 0.75; // triggers reactivity
const btc = [Link][0];
[Link](`Held BTC for ${[Link]} days → Profit: $$
{[Link](2)}`);
```
**Real-world wins**:
- No more `new Date()` timezone bugs when users in Addis Ababa vs.
London.
- Precise P&L reports for tax season.
- Safe math even across DST changes or leap years.
### Advanced Features You’ll Use in Production
**Formatting** (works perfectly with `[Link]`):
```js
const formatted = [Link]('am-ET', {
dateStyle: 'full',
timeStyle: 'short',
timeZone: 'Africa/Addis_Ababa'
});
[Link](formatted); // Amharic + Ethiopian calendar support via options
```
**Rounding & Precision**:
```js
const rounded = [Link]({ smallestUnit: 'hour', roundingMode:
'halfExpand' });
```
**Calendars** (e.g., Ethiopian, Islamic, Hebrew):
```js
const ethiopianDate = [Link]({
year: 2018,
month: 7,
day: 15,
calendar: 'ethiopic'
});
```
### Best Practices (2026)
1. **Always be explicit** about timezones — never rely on browser local
time.
2. **Use `Instant`** for storage/serialization (e.g., database timestamps).
3. **Use `ZonedDateTime`** for display and user input.
4. **Convert between types** safely: `.toInstant()`,
`.toZonedDateTimeISO()`, etc.
5. **Polyfill** for Safari/Node until full support.
6. **Combine with previous concepts**: Put Temporal objects inside a Proxy
for reactive UIs, or yield them from async generators for live price +
timestamp streams.
### Migration Tip from `Date`
```js
// Old
const oldDate = new Date('2026-04-03T14:00:00+03:00');
// New (recommended)
const newDate = [Link]('2026-04-
03T14:00:00+03:00[Africa/Addis_Ababa]');
```
Would you like me to:
1. Give you the **complete integrated Crypto Portfolio Dashboard** using
Temporal + Proxy + async generators?
2. Show **[Link] server-side examples** (API date handling, scheduling)?
3. Dive into **custom calendars** (Ethiopian calendar support)?
4. Compare performance / memory vs old `Date`?
Just say the word — we can keep building production-ready advanced JS
together! 🚀
Which part do you want to explore or code next?
**Callbacks, Promises, and Async/Await – Deep Dive with Real-Life Practical
Examples (Tied to Temporal & Intl)**
These three are the **core of asynchronous JavaScript**. Understanding their
evolution and when to use each is essential for writing clean, maintainable
code in modern apps (dashboards, APIs, real-time crypto trackers, etc.).
### 1. Callbacks – The Original Pattern (Still Relevant)
**Theory**: A callback is a function passed as an argument to another
function and executed later (usually after an async operation finishes). It's
the foundation of the event loop.
**Problems**: "Callback hell" (nested pyramids), hard error handling, and
poor composition.
**Practical Example** – Old-style API fetch with callback (simulating a crypto
price fetch)
```js
function fetchCryptoPrice(coin, callback, errorCallback) {
// Simulate async network call
setTimeout(() => {
if (coin === 'BTC') {
const price = 68234.45;
const timestamp =
[Link]('Africa/Addis_Ababa');
callback({ coin, price, timestamp });
} else {
errorCallback(new Error(`Coin ${coin} not supported`));
}, 800);
}
// Usage (callback style)
fetchCryptoPrice(
'BTC',
(data) => {
[Link](`Price: $${[Link]}`);
[Link](`Fetched at: ${[Link]('am-ET',
{ timeStyle: 'short' })}`);
},
(err) => [Link]('Error:', [Link])
);
```
**Real-life use today**: Legacy libraries, event listeners
(`addEventListener`), or [Link]-style callbacks (e.g., `[Link]`). Avoid
deep nesting.
### 2. Promises – The Better Abstraction
**Theory**: A Promise represents a future value (pending → fulfilled or
rejected). It solves callback hell by allowing chaining with `.then()`,
`.catch()`, and `.finally()`.
Key methods:
- `[Link]()` / `[Link]()`
- `[Link]()` (parallel)
- `[Link]()` / `[Link]()`
- `[Link]()`
**Practical Example** – Promisified crypto price fetch + Temporal formatting
```js
function fetchCryptoPricePromise(coin) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (coin === 'BTC') {
const price = 68234.45;
const timestamp =
[Link]('Africa/Addis_Ababa');
resolve({ coin, price, timestamp });
} else {
reject(new Error(`Coin ${coin} not supported`));
}, 800);
});
// Usage with chaining
fetchCryptoPricePromise('BTC')
.then(data => {
[Link](`Price: $${[Link]}`);
return [Link]; // pass to next .then
})
.then(ts => {
const formatter = new [Link]('am-ET', {
dateStyle: 'medium',
timeStyle: 'short'
});
[Link]('Formatted:', [Link]([Link]()));
})
.catch(err => [Link]('Failed:', [Link]))
.finally(() => [Link]('Request completed'));
```
**Real-life use**: Most modern APIs (`fetch()` returns a Promise), libraries,
and as the foundation for async/await.
### 3. Async/Await – Syntactic Sugar Over Promises (Preferred in 2026)
**Theory**: `async` functions always return a Promise. `await` pauses
execution until the Promise settles (without blocking the event loop). It
makes async code look synchronous and improves readability + error
handling with `try/catch`.
**Key Rules**:
- Always `await` inside `async` functions.
- Use `try/catch` for errors (instead of `.catch()`).
- For parallel operations: `[Link]()` + `await`.
- Top-level `await` works in ES modules.
**Practical Example** – Clean async crypto portfolio fetch with Temporal +
Intl
```js
async function loadPortfolioWithPrices() {
try {
const coins = ['BTC', 'ETH', 'SOL'];
// Parallel fetches (best performance)
const pricePromises = [Link](coin => fetchCryptoPricePromise(coin));
const results = await [Link](pricePromises);
// Process with Temporal calculations
const now = [Link]('Africa/Addis_Ababa');
const portfolio = [Link](item => {
const holdingDays = [Link](now, { largestUnit:
'days' }).days;
return {
...item,
holdingDays,
formattedTime: [Link]('am-ET', {
dateStyle: 'medium',
timeStyle: 'short'
})
};
});
[Link]('Portfolio loaded:');
[Link](portfolio);
return portfolio;
} catch (error) {
[Link]('Portfolio load failed:', [Link]);
throw error; // re-throw if needed
// Call it
loadPortfolioWithPrices()
.then(portfolio => [Link]('✅ Done with', [Link], 'coins'))
.catch(err => [Link]('Top-level error'));
```
**Real-life advantages in production**:
- Much easier debugging (stack traces point to `await` lines).
- Sequential logic reads naturally.
- Combine with `for await...of` for streaming (e.g., live price generators from
earlier lessons).
### Comparison Table
| Aspect | Callbacks | Promises | Async/Await
|
|---------------------|----------------------------|-------------------------------|------------------------
---------|
| Readability | Poor (nesting) | Good (chaining) | Excellent
(looks sync) |
| Error Handling | Manual (error callbacks) | `.catch()` |
`try/catch` |
| Composition | Hard | Excellent (`[Link]`) | Excellent
+ clean |
| Parallelism | Manual | Native | With
`[Link]` |
| Use Case | Legacy / Events | Libraries / Wrappers |
Application logic (2026 default) |
### Advanced Patterns (Combining Everything)
1. **Promisify old callback APIs** (useful for legacy code):
```js
function promisify(fn) {
return (...args) => new Promise((resolve, reject) => {
fn(...args, (err, result) => err ? reject(err) : resolve(result));
});
```
2. **Error handling best practice**:
- Use `try/catch` in async functions.
- For multiple awaits: wrap in one try/catch or handle individually.
3. **With Temporal** (as shown above): Await fetches, then do precise date
math (`until()`, `add()`), then format with cached `[Link]`.
4. **Cancellation** (modern need): Use `AbortController` with `fetch` and
check `[Link]` in async flows.
### Recommendation for 2026
- **Default to async/await** for most business logic.
- Use **Promises** when returning from libraries or doing complex
composition.
- **Callbacks** only when interfacing with old APIs or event systems.
- In your Crypto Portfolio: Store timestamps as `[Link]`,
fetch prices with async/await + `[Link]`, calculate holdings with
Temporal, and display with `[Link]`.
Would you like me to:
1. Build the **full reactive Crypto Portfolio** using async/await + Proxy +
Temporal + Intl (integrating all previous concepts)?
2. Show error handling, loading states, and retries in a real dashboard
scenario?
3. Cover advanced patterns like `for await...of` with live price streams or
`AbortController` for cancelling fetches?
4. Compare performance or common pitfalls (e.g., forgetting `await`,
unhandled rejections)?
Tell me which one (or a specific example) you want next — we can code it
step-by-step! 🚀
**Temporal Serialization in Web Workers – Complete Practical Guide (April
2026)**
Temporal objects (**ZonedDateTime**, **Instant**, **PlainDate**, etc.) are
**not directly supported** by the **structured clone algorithm** used by
`postMessage()` and Web Workers.
You cannot send a raw `[Link]` instance across the
thread boundary — it will throw a `DataCloneError` in most environments
(especially if using the polyfill).
**Solution**: Always **serialize to string** before sending and **deserialize**
back inside the worker (and vice versa when returning results).
### Recommended Serialization Strategy
Use the built-in string representations (RFC 9557 / ISO 8601 extended
format):
- **For sending to worker** (main → worker):
`.toString()` or `.toJSON()` (which calls `toString()` internally for most
types).
- **For returning from worker** (worker → main):
Same — send strings, then reconstruct with `[Link]()`.
This is efficient, lossless, and works with both native Temporal (Chrome
144+, Firefox 139+) and the `@js-temporal/polyfill`.
#### Best Serialization Helpers (Reusable)
```js
// utils/[Link]
export const serializeTemporal = (value) => {
if (!value || typeof value !== 'object') return value;
// Handle single Temporal objects
if (value instanceof [Link] ||
value instanceof [Link] ||
value instanceof [Link] ||
value instanceof [Link] ||
value instanceof [Link] ||
value instanceof [Link]) {
return [Link](); // or [Link]() for Instant/ZonedDateTime
// Handle arrays and objects recursively
if ([Link](value)) {
return [Link](serializeTemporal);
if (typeof value === 'object') {
const serialized = {};
for (const key in value) {
serialized[key] = serializeTemporal(value[key]);
return serialized;
return value;
};
export const deserializeTemporal = (value) => {
if (typeof value !== 'string') return value;
// Try to detect and reconstruct Temporal types from string format
try {
// ZonedDateTime strings contain [TimeZone]
if ([Link]('[') && [Link](']')) {
return [Link](value);
// Instant ends with Z
if ([Link]('Z')) {
return [Link](value);
// PlainDate is YYYY-MM-DD
if (/^\d{4}-\d{2}-\d{2}$/.test(value)) {
return [Link](value);
// PlainDateTime has T but no timezone
if ([Link]('T') &&  && ) {
return [Link](value);
// Duration starts with P
if ([Link]('P')) {
return [Link](value);
return value;
} catch (e) {
return value; // fallback if not Temporal
};
// For deep objects/arrays
export const deserializeDeep = (value) => {
if ([Link](value)) return [Link](deserializeDeep);
if (typeof value === 'object' && value !== null) {
const result = {};
for (const key in value) {
result[key] = deserializeDeep(value[key]);
return result;
return deserializeTemporal(value);
};
```
### Full Real-Life Example: Heavy P&L Calculation in Worker
**Main Thread (with Proxy reactivity + Intl formatting)**
```js
import { serializeTemporal, deserializeDeep } from './[Link]';
const portfolio = new Proxy({ positions: [], analytics: null }, {
set(target, prop, value) {
target[prop] = value;
[Link]('🔄 Portfolio updated via Proxy');
return true;
});
const worker = new Worker('[Link]');
async function runHeavyPnLCalculation(positions) {
// Serialize Temporal dates before sending
const payload = {
type: 'computePnL',
positions: serializeTemporal(positions), // converts ZonedDateTime →
string
currentPrices: { BTC: 68234.45, ETH: 3250 }
};
[Link](payload);
[Link] = (e) => {
if ([Link] === 'pnlResult') {
// Deserialize back to real Temporal objects
const analytics = deserializeDeep([Link]);
// Now you can do more Temporal math on main thread if needed
const now = [Link]('Africa/Addis_Ababa');
[Link](item => {
[Link] = [Link]('am-ET', {
dateStyle: 'medium',
timeStyle: 'short'
});
});
[Link] = analytics;
};
// Example positions with Temporal
const positions = [{
coin: 'BTC',
amount: 0.5,
buyPrice: 62000,
buyDate: [Link]('2025-12-
15T10:30:00+03:00[Africa/Addis_Ababa]')
}];
runHeavyPnLCalculation(positions);
```
**Worker Script ([Link])**
```js
import { deserializeDeep, serializeTemporal } from './[Link]'; //
if using modules in worker (or inline the functions)
[Link] = async (e) => {
const { type, positions: rawPositions, currentPrices } = [Link];
if (type === 'computePnL') {
// Deserialize in worker
const positions = deserializeDeep(rawPositions);
const analytics = [Link](pos => {
const buyDate = [Link]; // now a real [Link]
const now = [Link]('Africa/Addis_Ababa'); //
worker supports [Link] if polyfill or native
const holdingPeriod = [Link](now, { largestUnit: 'days' });
const currentValue = [Link] * (currentPrices[[Link]] || 0);
const profit = currentValue - ([Link] * [Link]);
// Heavy computation example
let computation = 0;
for (let i = 0; i < 8_000_000; i++) computation += [Link](i % 1000);
return {
...pos,
holdingDays: [Link],
currentValue,
profit,
computationResult: computation // example heavy result
};
});
// Serialize results before sending back
[Link]({
type: 'pnlResult',
analytics: serializeTemporal(analytics)
});
};
```
### Important Notes (2026)
- **Native support** in Chrome 144+ and Firefox 139+ allows `Temporal`
inside workers without extra setup.
- **Polyfill** (`@js-temporal/polyfill`): Import it inside the worker file if
needed (workers support `import` in modern browsers).
- **Performance**: String serialization is fast enough for most cases. For
extremely large datasets, consider sending epoch nanoseconds
(`[Link]`) as `BigInt` (structured clone supports BigInt).
- **Error handling**: Always wrap `[Link]()` in try/catch —
malformed strings can throw.
- **Calendars & time zones**: They survive round-tripping perfectly via the
string format.
### Alternatives for Very Large Data
- Send only `epochNanoseconds` (as string or BigInt) for `Instant`.
- Use `structuredClone()` manually on main thread for testing.
- For ultra-performance: Convert to plain objects with numeric fields (year,
month, day, nanoseconds, timezoneId) before transfer.
This pattern integrates perfectly with everything we've covered:
- **Proxy** for reactivity on main thread
- **Async/await** + event loop awareness
- **[Link]** for localized display after deserialization
- Heavy math safely offloaded without freezing the UI
Would you like me to:
1. Provide the **complete self-contained HTML + worker files** you can copy-
paste and run?
2. Add **progress reporting** (multiple `postMessage` during long
computation)?
3. Show **cancellation** using `AbortController` pattern with workers?
4. Extend it with **Comlink** for cleaner function-style calls to the worker?
Just say the word — we can make this production-ready for your crypto
portfolio tracker! 🚀
Which part do you want to build or refine next?
======={{{{{{{{{{{{{}}}}}}}}}}}}}}}}}}============
**Event Loop Mechanics – Deep Dive (Browser-Focused, 2026)**
JavaScript is **single-threaded**: it executes one piece of code at a time on
the **call stack**. The **event loop** is the mechanism that makes it feel
asynchronous and non-blocking, allowing the browser (or [Link]) to handle
timers, network requests, DOM events, and more without freezing the UI.
### Core Components
1. **Call Stack**
- LIFO (Last In, First Out) structure.
- Synchronous code runs here.
- When a function is called, it’s pushed; when it finishes, it’s popped.
- If the stack is not empty, JavaScript cannot run anything else from
queues.
2. **Web APIs (Browser)**
- Hand off truly asynchronous work: `setTimeout`, `fetch`, DOM events,
`XMLHttpRequest`, etc.
- These run outside the main thread (in the browser’s background).
- When they complete, their callbacks are pushed to the appropriate
queue.
3. **Microtask Queue** (High priority)
- Contains: `[Link]/.catch/.finally`, `queueMicrotask()`,
`MutationObserver` callbacks.
- Async/await continuations (the code after `await`) are also scheduled as
microtasks.
4. **Macrotask Queue** (also called Task Queue or Callback Queue – Lower
priority)
- Contains: `setTimeout`, `setInterval`, DOM events (`click`, `scroll`),
`setImmediate` (Node), I/O callbacks, etc.
- The browser can have multiple task sources, but generally one main
queue for most user code.
5. **Event Loop**
- An infinite loop that checks the call stack.
- When the stack is **empty**, it moves to the next step.
### Exact Execution Order (Browser Event Loop)
Here’s the precise flow in modern browsers (as per WHATWG HTML spec and
current implementations):
1. Execute all **synchronous code** (push/pop on call stack).
2. When the call stack is empty:
- **Drain the entire microtask queue** (run all microtasks one by one; new
microtasks added during this are also run immediately in the same drain).
- (Browser-specific) Perform rendering/painting if needed (layout, paint,
composite) — this happens **after microtasks** but **before the next
macrotask**.
3. Take **one macrotask** from the macrotask queue and execute it.
4. Repeat: drain all microtasks again, render if needed, then next macrotask,
etc.
**Key Rule**:
**Microtasks always run before the next macrotask and before rendering.**
This is why `[Link]().then()` feels “faster” than `setTimeout(…, 0)`.
### Classic Example – Predict the Output
```js
[Link](‘1. Sync start’);
setTimeout(() => [Link](‘5. Macrotask (setTimeout 0)’), 0);
[Link]().then(() => [Link](‘3. Microtask (Promise)’));
queueMicrotask(() => [Link](‘4. Microtask (queueMicrotask)’));
[Link](‘2. Sync end’);
// Output order:
// 1. Sync start
// 2. Sync end
// 3. Microtask (Promise)
// 4. Microtask (queueMicrotask)
// 5. Macrotask (setTimeout 0)
```
**Why?**
- Synchronous code runs first (1 → 2).
- Microtasks drain completely before any macrotask.
- `setTimeout` (even with 0ms) is a macrotask.
### Async/Await & Promises in the Event Loop
`async/await` is syntactic sugar over Promises. An `await` pauses the async
function and schedules its continuation as a **microtask**.
```js
Async function demo() {
[Link](‘A’);
Await [Link](); // yields here → continuation becomes a microtask
[Link](‘B’); // runs as microtask
Await new Promise(r => setTimeout(r, 0)); // waits for a macrotask
[Link](‘C’);
[Link](‘Start’);
Demo();
[Link](‘End’);
// Typical output:
// Start
// A
// End
// B ← microtask
// C ← after macrotask (timeout)
```
### Real-Life Practical Example: Crypto Portfolio Live Updater
Tie this together with **Temporal**, **Intl**, **Proxy**, and **async/await**
from our previous lessons.
```js
Const portfolio = new Proxy({ positions: [] }, {
Set(target, prop, value) {
Target[prop] = value;
[Link](‘🔄 Portfolio state updated (Proxy)’);
Return true;
});
Async function startLivePriceUpdater() {
[Link](‘1. Starting updater (sync)’);
// Schedule a microtask
[Link]().then(() => {
[Link](‘3. Microtask: Initializing UI’);
});
// Add positions (sync)
[Link] = [
{ coin: ‘BTC’, amount: 0.5, buyDate:
[Link](‘Africa/Addis_Ababa’) }
];
// Simulate live price feed with macrotask + microtasks
setTimeout(async () => { // Macrotask
[Link](‘5. Macrotask: Price update received’);
const priceData = await fetchMockPrice(‘BTC’); // async → microtasks
inside
// This continuation after await runs as microtask
[Link](‘6. Microtask: Processing price’, [Link]);
Const now = [Link](‘Africa/Addis_Ababa’);
Const holding = [Link][0].[Link](now, { largestUnit:
‘days’ }).days;
[Link](`Held for ${holding} days → Formatted: $
{[Link](‘am-ET’, { timeStyle: ‘short’ })}`);
}, 100);
[Link](‘2. Sync end of starter’);
Async function fetchMockPrice(coin) {
Return new Promise(resolve => {
setTimeout(() => { // nested macrotask
resolve({ coin, price: 68234.45 });
}, 50);
});
}
startLivePriceUpdater();
```
**Expected rough order** (simplified):
1 → 2 → 3 (micro) → 5 (macrotask) → 6 (micro after await) → …
This pattern appears in real dashboards: heavy computation or network calls
don’t freeze the UI because the event loop keeps rendering between
macrotasks.
### Browser Rendering & Performance Tips
- Too many microtasks in a row can delay rendering (UI feels laggy).
- Use `requestAnimationFrame` for smooth animations (runs after
microtasks, before paint).
- For expensive work: offload to **Web Workers** (separate thread,
communicates via messages → macrotasks).
### [Link] vs Browser (Quick Note)
- **Browser**: Simpler (tasks → microtasks → render → next task).
- **[Link]**: 6 phases (timers → pending → idle/prepare → poll → check →
close callbacks). Microtasks (`[Link]` and Promises) drain between
phases.
For most frontend work (your crypto tracker), the browser model is what
matters.
### Common Pitfalls & Debugging
- Forgetting that `await` schedules a microtask → race conditions in React
effects or state updates.
- Blocking the main thread with long sync loops → UI freeze (no event loop
progress).
- Debug with Chrome DevTools **Performance** tab or **Sources** → Event
Listener Breakpoints.
Would you like me to:
1. Show a **step-by-step visual execution trace** of a more complex
example (with Temporal calculations + live updates)?
2. Build the **full reactive live crypto updater** that combines Proxy + async
generators + event loop awareness?
3. Cover **Web Workers** to keep heavy Temporal math off the main thread?
4. Dive into [Link] event loop phases for backend API handling?
Or give me a specific code snippet you’d like me to analyze with event loop
order.
Tell me what to explore or build next — we’re turning these mechanics into
production-grade patterns! 🚀