JavaScript Async and Promises Cheat Sheet

Promises, async/await, fetch, timers, generators, async iterables, and event loop patterns.

View
StandardDetailedCompact
Export
Copy the compact sheet, download it, or print it.
Download
`D` dense toggle · `C` copy all

Promises

Create, chain, settle, and compose promises.

Create resolved promise

javascriptANYjavascriptpromisesbasics
javascript
const p = Promise.resolve({ ok: true });

Create rejected promise

javascriptANYjavascriptpromisesbasics
javascript
const p = Promise.reject(new Error("Boom"));

then / catch / finally

javascriptANYjavascriptpromiseschaining
javascript
fetchData()
  .then((data) => transform(data))
  .catch((err) => console.error(err))
  .finally(() => console.log("done"));

Promise.all

javascriptANYjavascriptpromisesconcurrency
javascript
const [user, posts] = await Promise.all([getUser(), getPosts()]);

Promise.allSettled

javascriptANYjavascriptpromisesconcurrency
javascript
const results = await Promise.allSettled(tasks);

Promise.race

javascriptANYjavascriptpromisesconcurrency
javascript
const winner = await Promise.race([fast(), slow()]);

Promise.any

javascriptANYjavascriptpromisesconcurrency
javascript
const firstSuccess = await Promise.any(providers);

Async / Await

Write linear async flows and handle async errors.

Async function

javascriptANYjavascriptasync-awaitfunctions
javascript
async function loadUser(id) {
  const res = await fetch(`/api/users/${id}`);
  return res.json();
}

Await with try/catch

javascriptANYjavascriptasync-awaiterrors
javascript
try {
  const data = await loadUser(1);
  console.log(data);
} catch (err) {
  console.error(err);
}

Sequential await in loop

javascriptANYjavascriptasync-awaitloops
javascript
for (const url of urls) {
  const res = await fetch(url);
  console.log(await res.text());
}

Concurrent await with map

javascriptANYjavascriptasync-awaitconcurrency
javascript
const html = await Promise.all(urls.map(async (url) => {
  const res = await fetch(url);
  return res.text();
}));

Async IIFE

javascriptANYjavascriptasync-awaitiife
javascript
await (async () => {
  const config = await loadConfig();
  console.log(config);
})();

Fetch API

HTTP requests, JSON handling, abort signals, timeouts, and retries.

fetch GET JSON

javascriptANYjavascriptfetchhttp
javascript
const res = await fetch("/api/items");
const data = await res.json();

fetch POST JSON

javascriptANYjavascriptfetchhttp
javascript
const res = await fetch("/api/items", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify(payload),
});

Check response.ok

javascriptANYjavascriptfetcherrors
javascript
if (!res.ok) {
  throw new Error(`HTTP ${res.status}`);
}

Set custom headers

javascriptANYjavascriptfetchheaders
javascript
await fetch(url, {
  headers: { Authorization: `Bearer ${token}` },
});

Abort fetch with AbortController

javascriptANYjavascriptfetchabort
javascript
const controller = new AbortController();
setTimeout(() => controller.abort(), 3000);
await fetch(url, { signal: controller.signal });

Timeout with Promise.race

javascriptANYjavascriptfetchtimeout
javascript
await Promise.race([
  fetch(url),
  new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), 3000)),
]);

Send FormData

javascriptANYjavascriptfetchforms
javascript
const form = new FormData();
form.append("file", file);
await fetch("/upload", { method: "POST", body: form });

Simple retry helper

javascriptANYjavascriptfetchretry
javascript
async function withRetry(fn, retries = 3) {
  let lastError;
  for (let i = 0; i < retries; i++) {
    try { return await fn(); } catch (err) { lastError = err; }
  }
  throw lastError;
}

Timers and Event Loop

setTimeout, setInterval, microtasks, debouncing, and throttling.

setTimeout

javascriptANYjavascripttimersbasics
javascript
const timeoutId = setTimeout(() => {
  console.log("Later");
}, 1000);

clearTimeout

javascriptANYjavascripttimersbasics
javascript
clearTimeout(timeoutId);

setInterval

javascriptANYjavascripttimersbasics
javascript
const intervalId = setInterval(tick, 1000);

clearInterval

javascriptANYjavascripttimersbasics
javascript
clearInterval(intervalId);

queueMicrotask

javascriptANYjavascriptevent-loopmicrotasks
javascript
queueMicrotask(() => {
  console.log("Runs before next macrotask");
});

Debounce helper

javascriptANYjavascripttimersdebounce
javascript
function debounce(fn, wait = 250) {
  let timer;
  return (...args) => {
    clearTimeout(timer);
    timer = setTimeout(() => fn(...args), wait);
  };
}

Throttle helper

javascriptANYjavascripttimersthrottle
javascript
function throttle(fn, wait = 250) {
  let last = 0;
  return (...args) => {
    const now = Date.now();
    if (now - last >= wait) {
      last = now;
      fn(...args);
    }
  };
}

Iterables, Generators, and Async Iteration

Custom iterables, generators, and for-await-of loops.

Basic generator

javascriptANYjavascriptgeneratorsiterables
javascript
function* ids() {
  yield 1;
  yield 2;
  yield 3;
}

Consume generator

javascriptANYjavascriptgeneratorsiterables
javascript
const gen = ids();
gen.next(); // { value: 1, done: false }

Delegate with yield*

javascriptANYjavascriptgeneratorsiterables
javascript
function* combined() {
  yield* [1, 2];
  yield* [3, 4];
}

Custom iterable object

javascriptANYjavascriptiterablessymbols
javascript
const range = {
  from: 1,
  to: 3,
  *[Symbol.iterator]() {
    for (let i = this.from; i <= this.to; i++) yield i;
  },
};

Async generator

javascriptANYjavascriptasync-iteratorsgenerators
javascript
async function* pages() {
  let page = 1;
  while (page <= 3) {
    yield await fetch(`/api/page/${page++}`).then((r) => r.json());
  }
}

for await...of

javascriptANYjavascriptasync-iteratorsloops
javascript
for await (const page of pages()) {
  console.log(page);
}