❓ What is async/await?
asyncandawaitare syntactic sugar over Promises.They make asynchronous code look and behave like synchronous code.
Easier to read, easier to debug, avoids callback hell.
<div class="infographic-asyncawait">
<style>
.infographic-asyncawait {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--good: #1a8a5f;
--good-soft: #e1f2ea;
--amber: #a4720a;
--amber-soft: #faf1de;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', system-ui, sans-serif;
color: var(--ink);
background: var(--paper);
overflow-x: hidden;
}
.infographic-asyncawait[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--good: #4fbf8f;
--good-soft: #16281f;
--amber: #d9a94a;
--amber-soft: #2c2413;
}
.infographic-asyncawait * { box-sizing: border-box; }
.infographic-asyncawait h1, .infographic-asyncawait h2 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-asyncawait p { margin: 0; }
.infographic-asyncawait button { font-family: inherit; }
.aw-hero { text-align: center; margin-bottom: 1.4rem; }
.aw-hero h1 { font-size: clamp(1.4rem, 4.5vw, 1.9rem); }
.aw-hero p { color: var(--ink-soft); margin-top: 0.45rem; font-size: 0.86rem; }
.aw-section { padding: 1.6rem 0; border-bottom: 1px dashed var(--line); }
.aw-section:last-child { border-bottom: none; }
.aw-section h2 { font-size: 1rem; text-align: center; margin-bottom: 1rem; }
/* comparison */
.aw-compare { display: grid; grid-template-columns: 1fr 1fr; gap: 0.7rem; }
@media (max-width: 560px) { .aw-compare { grid-template-columns: 1fr; } }
.aw-compare-col h3 { font-family: 'IBM Plex Mono', monospace; font-size: 0.68rem; color: var(--ink-soft); text-align: center; margin-bottom: 0.4rem; font-weight: 700; }
.aw-code {
background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.7rem;
font-family: 'IBM Plex Mono', monospace; font-size: 0.62rem; line-height: 1.65; white-space: pre; overflow-x: auto;
}
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-str { color: #ce9178; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tok-com { color: #6a9955; }
/* trace section */
.aw-window { border-radius: 10px; overflow: hidden; box-shadow: 0 8px 30px rgba(0,0,0,0.35); margin-bottom: 1.2rem; }
.aw-titlebar { background: #2b2b2b; padding: 0.6rem 0.8rem; display: flex; align-items: center; gap: 0.5rem; }
.aw-tdot { width: 11px; height: 11px; border-radius: 50%; }
.aw-tdot.red { background: #ff5f57; }
.aw-tdot.yellow { background: #febc2e; }
.aw-tdot.green { background: #28c840; }
.aw-tfilename { flex: 1; text-align: center; color: #9a9a9a; font-family: 'IBM Plex Mono', monospace; font-size: 0.75rem; margin-right: 3.4rem; }
.aw-trace-code { background: #1e1e1e; color: #d4d4d4; padding: 1rem 1.1rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.75rem; line-height: 1.85; margin-bottom: 0; }
.aw-trace-code .ln { display: flex; align-items: center; justify-content: flex-start; gap: 0.5rem; padding: 0.05rem 0.3rem; border-radius: 3px; transition: background 0.3s ease; white-space: pre; }
.aw-trace-code .ln.is-active { background: rgba(37,99,235,0.25); }
/* horizontal icon pipeline */
.aw-hpipe { display: flex; align-items: center; justify-content: center; margin-top: 1.4rem; margin-bottom: 1.1rem; flex-wrap: nowrap; overflow-x: auto; padding-top: 0.6rem; padding-bottom: 0.2rem; }
.aw-hnode { display: flex; flex-direction: column; align-items: center; gap: 0.3rem; flex-shrink: 0; width: 56px; }
.aw-hnode .aw-hdot { width: 38px; height: 38px; border-radius: 50%; border: 1.5px solid var(--line); background: var(--paper-alt); display: flex; align-items: center; justify-content: center; transition: border-color 0.25s ease, background 0.25s ease, transform 0.25s ease; }
.aw-hnode .aw-hdot svg { width: 17px; height: 17px; stroke: var(--ink-soft); transition: stroke 0.25s ease; }
.aw-hnode.is-print.is-active .aw-hdot { border-color: var(--good); background: var(--good-soft); transform: scale(1.15); }
.aw-hnode.is-print.is-active .aw-hdot svg { stroke: var(--good); }
.aw-hnode.is-wait.is-active .aw-hdot { border-color: var(--amber); background: var(--amber-soft); }
.aw-hnode.is-wait.is-active .aw-hdot svg { stroke: var(--amber); animation: aw-spin 0.9s linear infinite; }
.aw-hconnect { width: 26px; height: 2px; background: var(--line); flex-shrink: 0; position: relative; align-self: center; }
.aw-hconnect-fill { position: absolute; left: 0; top: 0; bottom: 0; width: 0%; background: var(--accent); transition: width 0.35s ease; }
@keyframes aw-spin { to { transform: rotate(360deg); } }
.aw-console { margin: 0 auto; max-width: 300px; text-align: left; border: 1.5px solid var(--line); background: var(--paper-alt); padding: 0.5rem 0.75rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.7rem; min-height: 6.6em; }
.aw-console .aw-cline { opacity: 0; transition: opacity 0.25s ease; color: var(--good); }
.aw-console .aw-cline.is-shown { opacity: 1; }
.aw-play { display: block; margin: 1rem auto 0; border: none; background: var(--accent); color: #fff; padding: 0.5rem 1.2rem; font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.aw-play:active { transform: scale(0.96); }
.aw-play:disabled { opacity: 0.45; cursor: default; }
.aw-note { text-align: center; font-size: 0.8rem; color: var(--ink-soft); margin-top: 1.5rem; padding-top: 1.1rem; border-top: 1px dashed var(--line); }
.aw-note strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-asyncawait *, .infographic-asyncawait *::before, .infographic-asyncawait *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="aw-wrap">
<!-- trace -->
<div class="aw-section">
<h2>await pauses the function, not the program</h2>
<div class="aw-window">
<div class="aw-titlebar">
<div class="aw-tdot red"></div>
<div class="aw-tdot yellow"></div>
<div class="aw-tdot green"></div>
<div class="aw-tfilename">script.js</div>
</div>
<div class="aw-trace-code" id="awCode">
<div class="ln" data-line="-1"><span><span class="tok-kw">async function</span> <span class="tok-fn">run</span><span class="tok-punc">() {</span></span></div>
<div class="ln" data-line="1"><span> <span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-str">"start"</span><span class="tok-punc">);</span></span></div>
<div class="ln" data-line="2"><span> <span class="tok-kw">const</span> <span class="tok-var">user</span> <span class="tok-punc">=</span> <span class="tok-kw">await</span> <span class="tok-fn">loginUser</span><span class="tok-punc">();</span></span></div>
<div class="ln" data-line="3"><span> <span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">user</span><span class="tok-punc">);</span></span></div>
<div class="ln" data-line="4"><span> <span class="tok-kw">const</span> <span class="tok-var">videos</span> <span class="tok-punc">=</span> <span class="tok-kw">await</span> <span class="tok-fn">getUserVideos</span><span class="tok-punc">();</span></span></div>
<div class="ln" data-line="5"><span> <span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">videos</span><span class="tok-punc">);</span></span></div>
<div class="ln" data-line="-1"><span><span class="tok-punc">}</span></span></div>
<div class="ln" data-line="-1"><span><span class="tok-fn">run</span><span class="tok-punc">();</span></span></div>
</div>
</div>
<div class="aw-hpipe">
<div class="aw-hnode is-print" id="hn1">
<div class="aw-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m7 11 2-2-2-2"/><path d="M11 13h4"/><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/></svg></div>
</div>
<div class="aw-hconnect" id="hc1"><div class="aw-hconnect-fill"></div></div>
<div class="aw-hnode is-wait" id="hn2">
<div class="aw-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 22h14"/><path d="M5 2h14"/><path d="M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22"/><path d="M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2"/></svg></div>
</div>
<div class="aw-hconnect" id="hc2"><div class="aw-hconnect-fill"></div></div>
<div class="aw-hnode is-print" id="hn3">
<div class="aw-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m7 11 2-2-2-2"/><path d="M11 13h4"/><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/></svg></div>
</div>
<div class="aw-hconnect" id="hc3"><div class="aw-hconnect-fill"></div></div>
<div class="aw-hnode is-wait" id="hn4">
<div class="aw-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 22h14"/><path d="M5 2h14"/><path d="M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22"/><path d="M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2"/></svg></div>
</div>
<div class="aw-hconnect" id="hc4"><div class="aw-hconnect-fill"></div></div>
<div class="aw-hnode is-print" id="hn5">
<div class="aw-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m7 11 2-2-2-2"/><path d="M11 13h4"/><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/></svg></div>
</div>
</div>
<div class="aw-console">
<div class="aw-cline" id="c1">start</div>
<div class="aw-cline" id="c2">{ userEmail: "codeveda@..." }</div>
<div class="aw-cline" id="c3">[ "video1", "video2", "video3" ]</div>
</div>
<button class="aw-play" id="awPlay" type="button">run()</button>
</div>
<p class="aw-note">While the function is paused at <strong>await</strong>, the rest of your program keeps running — only the code *inside* that function waits, not the whole thread.</p>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-asyncawait')
|| document.querySelector('.infographic-asyncawait');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
const lines = wrapper.querySelectorAll('#awCode .ln');
const nodes = ['hn1', 'hn2', 'hn3', 'hn4', 'hn5'].map(id => wrapper.querySelector('#' + id));
const conns = ['hc1', 'hc2', 'hc3', 'hc4'].map(id => wrapper.querySelector('#' + id + ' .aw-hconnect-fill'));
const c1 = wrapper.querySelector('#c1');
const c2 = wrapper.querySelector('#c2');
const c3 = wrapper.querySelector('#c3');
const playBtn = wrapper.querySelector('#awPlay');
function setLine(n) {
lines.forEach(l => l.classList.toggle('is-active', Number(l.dataset.line) === n));
}
function lightNode(i) {
nodes.forEach((nd, idx) => nd.classList.toggle('is-active', idx === i));
}
playBtn.addEventListener('click', () => {
playBtn.disabled = true;
setLine(-1);
nodes.forEach(n => n.classList.remove('is-active'));
conns.forEach(c => { c.style.width = '0%'; });
[c1, c2, c3].forEach(c => c.classList.remove('is-shown'));
const WAIT1 = 900, WAIT2 = 1500;
let t = 100;
setTimeout(() => { setLine(1); lightNode(0); c1.classList.add('is-shown'); }, t);
t += 350;
setTimeout(() => { conns[0].style.width = '100%'; }, t);
t += 150;
setTimeout(() => { setLine(2); lightNode(1); }, t);
t += WAIT1;
setTimeout(() => { conns[1].style.width = '100%'; }, t);
t += 150;
setTimeout(() => { setLine(3); lightNode(2); c2.classList.add('is-shown'); }, t);
t += 350;
setTimeout(() => { conns[2].style.width = '100%'; }, t);
t += 150;
setTimeout(() => { setLine(4); lightNode(3); }, t);
t += WAIT2;
setTimeout(() => { conns[3].style.width = '100%'; }, t);
t += 150;
setTimeout(() => { setLine(5); lightNode(4); c3.classList.add('is-shown'); }, t);
t += 400;
setTimeout(() => { setLine(-1); nodes.forEach(n => n.classList.remove('is-active')); playBtn.disabled = false; }, t);
});
})();
</script>🔹 1. async Keyword
A function becomes asynchronous when you add
asyncbefore it.An
asyncfunction always returns a Promise.
Example:
async function greet() {
return "Hello";
}
greet().then(res => console.log(res)); // HelloEven though you return a string, JS wraps it in a Promise.
🔹 2. await Keyword
awaitpauses the execution of the function until the Promise settles.It can only be used inside an async function.
It returns the resolved value of the Promise.
Example:
function fetchUser() {
return new Promise(resolve => {
setTimeout(() => resolve("User fetched"), 1000);
});
}
async function getUser() {
const user = await fetchUser();
console.log(user);
}
getUser();User fetched✏️ Real-Life Example
☕ Think of await like waiting in a queue:
You order coffee → (Promise is created)
You wait until the coffee is ready → (
await)After the coffee is ready, you continue your work.
🔴 Handling Errors in async/await
Use try/catch instead of .catch():
<div class="infographic-trycatch">
<style>
.infographic-trycatch {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--good: #1a8a5f;
--good-soft: #e1f2ea;
--bad: #c8452e;
--bad-soft: #f7e3df;
--amber: #a4720a;
--amber-soft: #faf1de;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', system-ui, sans-serif;
color: var(--ink);
background: var(--paper);
overflow-x: hidden;
}
.infographic-trycatch[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--good: #4fbf8f;
--good-soft: #16281f;
--bad: #e0715a;
--bad-soft: #2e211d;
--amber: #d9a94a;
--amber-soft: #2c2413;
}
.infographic-trycatch * { box-sizing: border-box; }
.infographic-trycatch h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-trycatch p { margin: 0; }
.infographic-trycatch button { font-family: inherit; }
.tc2-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.tc2-hero { text-align: center; margin-bottom: 1.3rem; }
.tc2-hero h1 { font-size: clamp(1.35rem, 4.5vw, 1.85rem); }
.tc2-hero p { color: var(--ink-soft); margin-top: 0.45rem; font-size: 0.86rem; }
.tc2-window { border-radius: 10px; overflow: hidden; box-shadow: 0 8px 30px rgba(0,0,0,0.35); margin-bottom: 1.3rem; }
.tc2-titlebar { background: #2b2b2b; padding: 0.6rem 0.8rem; display: flex; align-items: center; gap: 0.5rem; }
.tc2-dot { width: 11px; height: 11px; border-radius: 50%; }
.tc2-dot.red { background: #ff5f57; }
.tc2-dot.yellow { background: #febc2e; }
.tc2-dot.green { background: #28c840; }
.tc2-filename { flex: 1; text-align: center; color: #9a9a9a; font-family: 'IBM Plex Mono', monospace; font-size: 0.75rem; margin-right: 3.4rem; }
.tc2-code { background: #1e1e1e; color: #d4d4d4; padding: 1rem 1.1rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; line-height: 1.8; }
.tc2-code .ln { display: block; padding: 0.05rem 0.3rem; border-radius: 3px; transition: background 0.3s ease; white-space: pre; }
.tc2-code .ln.is-active { background: rgba(37,99,235,0.25); }
.tc2-code .ln.is-active.bad-line { background: rgba(200,69,46,0.25); }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-str { color: #ce9178; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tc2-toggle-row { display: flex; align-items: center; justify-content: center; gap: 0.6rem; margin: 1.1rem 0; }
.tc2-toggle-label { font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; color: var(--ink-soft); }
.tc2-toggle { display: flex; border: 1.5px solid var(--line); overflow: hidden; }
.tc2-toggle button { border: none; background: var(--paper-alt); color: var(--ink-soft); padding: 0.32rem 0.7rem; font-size: 0.68rem; font-weight: 700; cursor: pointer; font-family: 'IBM Plex Mono', monospace; }
.tc2-toggle button.on.is-active { background: var(--bad-soft); color: var(--bad); }
.tc2-toggle button.off.is-active { background: var(--good-soft); color: var(--good); }
/* horizontal icon pipeline */
.tc2-hpipe { display: flex; align-items: center; justify-content: center; margin-top: 0.6rem; margin-bottom: 1.1rem; flex-wrap: nowrap; overflow-x: auto; padding-top: 0.4rem; }
.tc2-hnode { display: flex; flex-direction: column; align-items: center; gap: 0.3rem; flex-shrink: 0; width: 68px; }
.tc2-hnode .tc2-hdot { width: 38px; height: 38px; border-radius: 50%; border: 1.5px solid var(--line); background: var(--paper-alt); display: flex; align-items: center; justify-content: center; transition: border-color 0.25s ease, background 0.25s ease, transform 0.25s ease; }
.tc2-hnode .tc2-hdot svg { width: 17px; height: 17px; stroke: var(--ink-soft); transition: stroke 0.25s ease; }
.tc2-hnode .tc2-hlabel { font-size: 0.56rem; color: var(--ink-soft); text-align: center; opacity: 0; transition: opacity 0.25s ease; }
.tc2-hnode.is-active .tc2-hlabel { opacity: 1; }
.tc2-hnode.state-wait.is-active .tc2-hdot { border-color: var(--amber); background: var(--amber-soft); }
.tc2-hnode.state-wait.is-active .tc2-hdot svg { stroke: var(--amber); animation: tc2-spin 0.9s linear infinite; }
.tc2-hnode.state-good.is-active .tc2-hdot { border-color: var(--good); background: var(--good-soft); transform: scale(1.15); }
.tc2-hnode.state-good.is-active .tc2-hdot svg { stroke: var(--good); }
.tc2-hnode.state-bad.is-active .tc2-hdot { border-color: var(--bad); background: var(--bad-soft); transform: scale(1.15); }
.tc2-hnode.state-bad.is-active .tc2-hdot svg { stroke: var(--bad); }
.tc2-hnode.state-neutral.is-active .tc2-hdot { border-color: var(--accent); background: var(--accent-soft); transform: scale(1.1); }
.tc2-hnode.state-neutral.is-active .tc2-hdot svg { stroke: var(--accent); }
@keyframes tc2-spin { to { transform: rotate(360deg); } }
.tc2-hconnect { width: 22px; height: 2px; background: var(--line); flex-shrink: 0; align-self: center; position: relative; margin-top: -14px; }
.tc2-hconnect-fill { position: absolute; left: 0; top: 0; bottom: 0; width: 0%; background: var(--accent); transition: width 0.3s ease; }
.tc2-hconnect-fill.bad-fill { background: var(--bad); }
.tc2-console { margin: 0 auto; max-width: 320px; text-align: left; border: 1.5px solid var(--line); background: var(--paper-alt); padding: 0.5rem 0.75rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.7rem; min-height: 3.4em; }
.tc2-console .tc2-cline { opacity: 0; transition: opacity 0.25s ease; }
.tc2-console .tc2-cline.good { color: var(--good); }
.tc2-console .tc2-cline.bad { color: var(--bad); }
.tc2-console .tc2-cline.neutral { color: var(--accent); }
.tc2-console .tc2-cline.is-shown { opacity: 1; }
.tc2-play { display: block; margin: 1.1rem auto 0; border: none; background: var(--accent); color: #fff; padding: 0.5rem 1.2rem; font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.tc2-play:active { transform: scale(0.96); }
.tc2-play:disabled { opacity: 0.45; cursor: default; }
.tc2-note { text-align: center; font-size: 0.8rem; color: var(--ink-soft); margin-top: 1.5rem; padding-top: 1.1rem; border-top: 1px dashed var(--line); }
.tc2-note strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-trycatch *, .infographic-trycatch *::before, .infographic-trycatch *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="tc2-wrap">
<div class="tc2-window">
<div class="tc2-titlebar">
<div class="tc2-dot red"></div>
<div class="tc2-dot yellow"></div>
<div class="tc2-dot green"></div>
<div class="tc2-filename">script.js</div>
</div>
<div class="tc2-code" id="tcCode">
<div class="ln" data-line="-1"><span><span class="tok-kw">async function</span> <span class="tok-fn">getData</span><span class="tok-punc">() {</span></span></div>
<div class="ln" data-line="1"><span> <span class="tok-kw">try</span> <span class="tok-punc">{</span></span></div>
<div class="ln" data-line="2"><span> <span class="tok-kw">const</span> <span class="tok-var">res</span> <span class="tok-punc">=</span> <span class="tok-kw">await</span> <span class="tok-fn">fetch</span><span class="tok-punc">(</span><span class="tok-str">"https://api.example.com"</span><span class="tok-punc">);</span></span></div>
<div class="ln" data-line="3"><span> <span class="tok-kw">const</span> <span class="tok-var">data</span> <span class="tok-punc">=</span> <span class="tok-kw">await</span> <span class="tok-var">res</span><span class="tok-punc">.</span><span class="tok-fn">json</span><span class="tok-punc">();</span></span></div>
<div class="ln" data-line="4"><span> <span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">data</span><span class="tok-punc">);</span></span></div>
<div class="ln bad-line" data-line="5"><span> <span class="tok-punc">} </span><span class="tok-kw">catch</span> <span class="tok-punc">(</span><span class="tok-var">err</span><span class="tok-punc">) {</span></span></div>
<div class="ln bad-line" data-line="6"><span> <span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-str">"Error:"</span><span class="tok-punc">,</span> <span class="tok-var">err</span><span class="tok-punc">);</span></span></div>
<div class="ln" data-line="7"><span> <span class="tok-punc">} </span><span class="tok-kw">finally</span> <span class="tok-punc">{</span></span></div>
<div class="ln" data-line="8"><span> <span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-str">"Request finished"</span><span class="tok-punc">);</span></span></div>
<div class="ln" data-line="-1"><span> <span class="tok-punc">}</span></span></div>
<div class="ln" data-line="-1"><span><span class="tok-punc">}</span></span></div>
</div>
</div>
<div class="tc2-toggle-row">
<span class="tc2-toggle-label">fetch fails?</span>
<div class="tc2-toggle" id="tcToggle">
<button class="off is-active" data-val="off" type="button">no</button>
<button class="on" data-val="on" type="button">yes</button>
</div>
</div>
<div class="tc2-hpipe">
<div class="tc2-hnode state-neutral" id="n1">
<div class="tc2-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m22 2-7 20-4-9-9-4Z"/><path d="M22 2 11 13"/></svg></div>
<div class="tc2-hlabel">fetch</div>
</div>
<div class="tc2-hconnect" id="c1"><div class="tc2-hconnect-fill"></div></div>
<div class="tc2-hnode state-wait" id="n2">
<div class="tc2-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 22h14"/><path d="M5 2h14"/><path d="M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22"/><path d="M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2"/></svg></div>
<div class="tc2-hlabel">waiting</div>
</div>
<div class="tc2-hconnect" id="c2"><div class="tc2-hconnect-fill"></div></div>
<div class="tc2-hnode state-good" id="n3">
<div class="tc2-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" id="n3icon"><path d="M20 6 9 17l-5-5"/></svg></div>
<div class="tc2-hlabel" id="n3label">try succeeds</div>
</div>
<div class="tc2-hconnect" id="c3"><div class="tc2-hconnect-fill"></div></div>
<div class="tc2-hnode state-neutral" id="n4">
<div class="tc2-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528"/></svg></div>
<div class="tc2-hlabel">finally</div>
</div>
</div>
<div class="tc2-console">
<div class="tc2-cline good" id="cData">{ ...json data... }</div>
<div class="tc2-cline bad" id="cErr">Error: TypeError: Failed to fetch</div>
<div class="tc2-cline neutral" id="cFin">Request finished</div>
</div>
<button class="tc2-play" id="tcPlay" type="button">getData()</button>
<p class="tc2-note"><strong>finally</strong> runs whether <strong>try</strong> succeeds or <strong>catch</strong> catches — it's for cleanup that has to happen either way.</p>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-trycatch')
|| document.querySelector('.infographic-trycatch');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
let willFail = false;
const toggle = wrapper.querySelector('#tcToggle');
toggle.querySelectorAll('button').forEach(b => {
b.addEventListener('click', () => {
willFail = b.dataset.val === 'on';
toggle.querySelectorAll('button').forEach(x => x.classList.remove('is-active'));
b.classList.add('is-active');
});
});
const lines = wrapper.querySelectorAll('#tcCode .ln');
const n1 = wrapper.querySelector('#n1');
const n2 = wrapper.querySelector('#n2');
const n3 = wrapper.querySelector('#n3');
const n3icon = wrapper.querySelector('#n3icon');
const n3label = wrapper.querySelector('#n3label');
const n4 = wrapper.querySelector('#n4');
const c1 = wrapper.querySelector('#c1 .tc2-hconnect-fill');
const c2 = wrapper.querySelector('#c2 .tc2-hconnect-fill');
const c3 = wrapper.querySelector('#c3 .tc2-hconnect-fill');
const cData = wrapper.querySelector('#cData');
const cErr = wrapper.querySelector('#cErr');
const cFin = wrapper.querySelector('#cFin');
const playBtn = wrapper.querySelector('#tcPlay');
function setLine(n) {
lines.forEach(l => l.classList.toggle('is-active', Number(l.dataset.line) === n));
}
playBtn.addEventListener('click', () => {
playBtn.disabled = true;
setLine(-1);
[n1, n2, n3, n4].forEach(n => n.classList.remove('is-active'));
n3.classList.remove('state-good', 'state-bad');
n3.classList.add('state-good');
n3icon.innerHTML = '<path d="M20 6 9 17l-5-5"/>';
n3label.textContent = 'try succeeds';
[c1, c2, c3].forEach(c => { c.style.width = '0%'; c.classList.remove('bad-fill'); });
[cData, cErr, cFin].forEach(c => c.classList.remove('is-shown'));
const WAIT = 1100;
let t = 100;
setTimeout(() => { setLine(1); }, t);
t += 300;
setTimeout(() => { setLine(2); n1.classList.add('is-active'); }, t);
t += 300;
setTimeout(() => { c1.style.width = '100%'; }, t);
t += 150;
setTimeout(() => { n2.classList.add('is-active'); }, t);
t += WAIT;
setTimeout(() => { c2.style.width = '100%'; if (willFail) c2.classList.add('bad-fill'); n2.classList.remove('is-active'); }, t);
t += 150;
if (willFail) {
setTimeout(() => {
n3.classList.remove('state-good');
n3.classList.add('state-bad');
n3icon.innerHTML = '<path d="M18 6 6 18"/><path d="m6 6 12 12"/>';
n3label.textContent = 'catch runs';
n3.classList.add('is-active');
setLine(5);
}, t);
t += 350;
setTimeout(() => { setLine(6); cErr.classList.add('is-shown'); }, t);
t += 400;
} else {
setTimeout(() => {
n3.classList.add('is-active');
setLine(3);
}, t);
t += 350;
setTimeout(() => { setLine(4); cData.classList.add('is-shown'); }, t);
t += 400;
}
setTimeout(() => { c3.style.width = '100%'; }, t);
t += 150;
setTimeout(() => { setLine(7); n4.classList.add('is-active'); }, t);
t += 300;
setTimeout(() => { setLine(8); cFin.classList.add('is-shown'); }, t);
t += 400;
setTimeout(() => { setLine(-1); playBtn.disabled = false; }, t);
});
})();
</script>⏰ Multiple Awaits — Promise Chaining with async/await
<div class="infographic-multiawait">
<style>
.infographic-multiawait {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--good: #1a8a5f;
--good-soft: #e1f2ea;
--amber: #a4720a;
--amber-soft: #faf1de;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', system-ui, sans-serif;
color: var(--ink);
background: var(--paper);
overflow-x: hidden;
}
.infographic-multiawait[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--good: #4fbf8f;
--good-soft: #16281f;
--amber: #d9a94a;
--amber-soft: #2c2413;
}
.infographic-multiawait * { box-sizing: border-box; }
.infographic-multiawait h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-multiawait p { margin: 0; }
.infographic-multiawait button { font-family: inherit; }
.ma-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.ma-hero { text-align: center; margin-bottom: 1.3rem; }
.ma-hero h1 { font-size: clamp(1.35rem, 4.5vw, 1.85rem); }
.ma-hero p { color: var(--ink-soft); margin-top: 0.45rem; font-size: 0.86rem; }
.ma-window { border-radius: 10px; overflow: hidden; box-shadow: 0 8px 30px rgba(0,0,0,0.35); margin-bottom: 1.2rem; }
.ma-titlebar { background: #2b2b2b; padding: 0.6rem 0.8rem; display: flex; align-items: center; gap: 0.5rem; }
.ma-dot { width: 11px; height: 11px; border-radius: 50%; }
.ma-dot.red { background: #ff5f57; }
.ma-dot.yellow { background: #febc2e; }
.ma-dot.green { background: #28c840; }
.ma-filename { flex: 1; text-align: center; color: #9a9a9a; font-family: 'IBM Plex Mono', monospace; font-size: 0.75rem; margin-right: 3.4rem; }
.ma-code { background: #1e1e1e; color: #d4d4d4; padding: 1rem 1.1rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.74rem; line-height: 1.85; }
.ma-code .ln { display: flex; align-items: center; gap: 0.5rem; padding: 0.05rem 0.3rem; border-radius: 3px; transition: background 0.3s ease; white-space: pre; }
.ma-code .ln.is-active { background: rgba(37,99,235,0.25); }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-str { color: #ce9178; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tok-num { color: #b5cea8; }
.ma-elapsed { text-align: center; font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; color: var(--ink-soft); margin: 1rem 0 0.5rem; }
.ma-elapsed strong { color: var(--ink); }
/* horizontal icon pipeline */
.ma-hpipe { display: flex; align-items: center; justify-content: center; margin-bottom: 1.1rem; flex-wrap: nowrap; overflow-x: auto; padding-top: 0.5rem; }
.ma-hnode { display: flex; flex-direction: column; align-items: center; gap: 0.3rem; flex-shrink: 0; width: 62px; }
.ma-hnode .ma-hdot { width: 36px; height: 36px; border-radius: 50%; border: 1.5px solid var(--line); background: var(--paper-alt); display: flex; align-items: center; justify-content: center; transition: border-color 0.25s ease, background 0.25s ease, transform 0.25s ease; }
.ma-hnode .ma-hdot svg { width: 16px; height: 16px; stroke: var(--ink-soft); transition: stroke 0.25s ease; }
.ma-hnode .ma-hlabel { font-size: 0.55rem; color: var(--ink-soft); text-align: center; opacity: 0; transition: opacity 0.25s ease; }
.ma-hnode.is-active .ma-hlabel { opacity: 1; }
.ma-hnode.state-wait.is-active .ma-hdot { border-color: var(--amber); background: var(--amber-soft); }
.ma-hnode.state-wait.is-active .ma-hdot svg { stroke: var(--amber); animation: ma-spin 0.9s linear infinite; }
.ma-hnode.state-good.is-active .ma-hdot { border-color: var(--good); background: var(--good-soft); transform: scale(1.15); }
.ma-hnode.state-good.is-active .ma-hdot svg { stroke: var(--good); }
@keyframes ma-spin { to { transform: rotate(360deg); } }
.ma-hconnect { width: 18px; height: 2px; background: var(--line); flex-shrink: 0; align-self: center; position: relative; margin-top: -12px; }
.ma-hconnect-fill { position: absolute; left: 0; top: 0; bottom: 0; width: 0%; background: var(--accent); transition: width 0.3s ease; }
.ma-console { margin: 0 auto; max-width: 320px; text-align: left; border: 1.5px solid var(--line); background: var(--paper-alt); padding: 0.5rem 0.75rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.7rem; min-height: 1.8em; }
.ma-console .ma-cline { opacity: 0; transition: opacity 0.25s ease; color: var(--good); }
.ma-console .ma-cline.is-shown { opacity: 1; }
.ma-play { display: block; margin: 1.1rem auto 0; border: none; background: var(--accent); color: #fff; padding: 0.5rem 1.2rem; font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.ma-play:active { transform: scale(0.96); }
.ma-play:disabled { opacity: 0.45; cursor: default; }
.ma-note { text-align: center; font-size: 0.8rem; color: var(--ink-soft); margin-top: 1.5rem; padding-top: 1.1rem; border-top: 1px dashed var(--line); }
.ma-note strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-multiawait *, .infographic-multiawait *::before, .infographic-multiawait *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="ma-wrap">
<div class="ma-window">
<div class="ma-titlebar">
<div class="ma-dot red"></div>
<div class="ma-dot yellow"></div>
<div class="ma-dot green"></div>
<div class="ma-filename">script.js</div>
</div>
<div class="ma-code" id="maCode">
<div class="ln" data-line="-1"><span><span class="tok-kw">async function</span> <span class="tok-fn">process</span><span class="tok-punc">() {</span></span></div>
<div class="ln" data-line="1"><span> <span class="tok-kw">const</span> <span class="tok-var">user</span> <span class="tok-punc">=</span> <span class="tok-kw">await</span> <span class="tok-fn">loginUser</span><span class="tok-punc">(</span><span class="tok-str">"email"</span><span class="tok-punc">,</span> <span class="tok-str">"1234"</span><span class="tok-punc">);</span></span></div>
<div class="ln" data-line="2"><span> <span class="tok-kw">const</span> <span class="tok-var">videos</span> <span class="tok-punc">=</span> <span class="tok-kw">await</span> <span class="tok-fn">getUserVideos</span><span class="tok-punc">(</span><span class="tok-var">user</span><span class="tok-punc">);</span></span></div>
<div class="ln" data-line="3"><span> <span class="tok-kw">const</span> <span class="tok-var">details</span> <span class="tok-punc">=</span> <span class="tok-kw">await</span> <span class="tok-fn">videoDetails</span><span class="tok-punc">(</span><span class="tok-var">videos</span><span class="tok-punc">[</span><span class="tok-num">0</span><span class="tok-punc">]);</span></span></div>
<div class="ln" data-line="-1"><span> </span></div>
<div class="ln" data-line="4"><span> <span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">details</span><span class="tok-punc">);</span></span></div>
<div class="ln" data-line="-1"><span><span class="tok-punc">}</span></span></div>
</div>
</div>
<div class="ma-elapsed">t = <strong id="maElapsed">0s</strong></div>
<div class="ma-hpipe">
<div class="ma-hnode state-wait" id="mn1">
<div class="ma-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 22h14"/><path d="M5 2h14"/><path d="M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22"/><path d="M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2"/></svg></div>
<div class="ma-hlabel">login</div>
</div>
<div class="ma-hconnect" id="mc1"><div class="ma-hconnect-fill"></div></div>
<div class="ma-hnode state-good" id="mn2">
<div class="ma-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg></div>
<div class="ma-hlabel">got user</div>
</div>
<div class="ma-hconnect" id="mc2"><div class="ma-hconnect-fill"></div></div>
<div class="ma-hnode state-wait" id="mn3">
<div class="ma-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 22h14"/><path d="M5 2h14"/><path d="M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22"/><path d="M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2"/></svg></div>
<div class="ma-hlabel">videos</div>
</div>
<div class="ma-hconnect" id="mc3"><div class="ma-hconnect-fill"></div></div>
<div class="ma-hnode state-good" id="mn4">
<div class="ma-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 10h20"/><rect width="20" height="16" x="2" y="6" rx="2"/><circle cx="8" cy="14" r="1"/></svg></div>
<div class="ma-hlabel">got list</div>
</div>
<div class="ma-hconnect" id="mc4"><div class="ma-hconnect-fill"></div></div>
<div class="ma-hnode state-wait" id="mn5">
<div class="ma-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 22h14"/><path d="M5 2h14"/><path d="M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22"/><path d="M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2"/></svg></div>
<div class="ma-hlabel">details</div>
</div>
<div class="ma-hconnect" id="mc5"><div class="ma-hconnect-fill"></div></div>
<div class="ma-hnode state-good" id="mn6">
<div class="ma-hdot"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m7 11 2-2-2-2"/><path d="M11 13h4"/><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/></svg></div>
<div class="ma-hlabel">printed</div>
</div>
</div>
<div class="ma-console">
<div class="ma-cline" id="mLog">"title of the video"</div>
</div>
<button class="ma-play" id="maPlay" type="button">process()</button>
<p class="ma-note">Reads top to bottom like normal code — but it's the exact same <strong>1s → 2s → 3s</strong> chain from the callback version, still six seconds end to end.</p>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-multiawait')
|| document.querySelector('.infographic-multiawait');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
const lines = wrapper.querySelectorAll('#maCode .ln');
const nodes = ['mn1', 'mn2', 'mn3', 'mn4', 'mn5', 'mn6'].map(id => wrapper.querySelector('#' + id));
const conns = ['mc1', 'mc2', 'mc3', 'mc4', 'mc5'].map(id => wrapper.querySelector('#' + id + ' .ma-hconnect-fill'));
const elapsed = wrapper.querySelector('#maElapsed');
const mLog = wrapper.querySelector('#mLog');
const playBtn = wrapper.querySelector('#maPlay');
function setLine(n) { lines.forEach(l => l.classList.toggle('is-active', Number(l.dataset.line) === n)); }
function lightNode(i, on) { nodes[i].classList.toggle('is-active', on); }
playBtn.addEventListener('click', () => {
playBtn.disabled = true;
setLine(-1);
nodes.forEach(n => n.classList.remove('is-active'));
conns.forEach(c => { c.style.width = '0%'; });
mLog.classList.remove('is-shown');
elapsed.textContent = '0s';
const W1 = 700, W2 = 1400, W3 = 2100; // scaled 1s/2s/3s
let t = 100;
setTimeout(() => { setLine(1); lightNode(0, true); }, t);
t += W1;
setTimeout(() => { conns[0].style.width = '100%'; lightNode(0, false); lightNode(1, true); elapsed.textContent = '1s'; }, t);
t += 150;
setTimeout(() => { conns[1].style.width = '100%'; lightNode(1, false); setLine(2); lightNode(2, true); }, t);
t += W2;
setTimeout(() => { conns[2].style.width = '100%'; lightNode(2, false); lightNode(3, true); elapsed.textContent = '3s'; }, t);
t += 150;
setTimeout(() => { conns[3].style.width = '100%'; lightNode(3, false); setLine(3); lightNode(4, true); }, t);
t += W3;
setTimeout(() => { conns[4].style.width = '100%'; lightNode(4, false); lightNode(5, true); elapsed.textContent = '6s'; }, t);
t += 150;
setTimeout(() => { setLine(4); mLog.classList.add('is-shown'); }, t);
t += 400;
setTimeout(() => { setLine(-1); playBtn.disabled = false; }, t);
});
})();
</script>Looks synchronous but is still asynchronous.
↔️ Parallel Execution with Promise.all()
Avoid doing this (slow):
const a = await task1();
const b = await task2();Better:
const [a, b] = await Promise.all([task1(), task2()]);Runs both tasks at the same time.
⭐ Where async/await Shines
API calls
Database queries
Reading/writing files
Delayed tasks (
setTimeout)Heavy async flows (login → fetch data → render)