October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsWindows FixRecommendedWindows errors stealing your time? Find the fix fastScan stability, cleanup and performance issues.Fix NowOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
World desk4 min

Promise Chaining vs. async/await: Which Should You Use?

Promise chains and async/await use the same promise model. Choose the style that clarifies dependencies, and use Promise composition to handle independent work.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use async/await when it makes a dependent sequence easier to follow as steps; use .then() when a compact transformation chain is clearer. Both use the same promise model. For independent operations, start them before combining their results rather than awaiting them one by one.

How do async/await and promises relate?

async/await is syntax built on promises, not a separate asynchronous system. An async function returns a promise. Inside it, await waits for a promise to settle and makes its fulfilled value available to the surrounding function. Top-level await is also permitted in supported module contexts.

As an Amazon Associate I earn from qualifying purchases.

In a promise chain, each .then() returns a new promise. A handler can return a plain value or another promise, and the next handler receives the resulting value once it is available. MDN summarizes the relationship: “async/await has the same concurrency semantics as normal promise chains.”

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

What does each style look like?

Here is the same dependent workflow in both styles: obtain a URL, fetch a response, parse its JSON, then use the data.

Promise chain

function logIngredients() {
  return doSomething()
    .then((url) => fetch(url))
    .then((response) => response.json())
    .then((data) => {
      listOfIngredients.push(data);
      console.log(listOfIngredients);
    });
}

async/await

async function logIngredients() {
  const url = await doSomething();
  const response = await fetch(url);
  const data = await response.json();
  listOfIngredients.push(data);
  console.log(listOfIngredients);
}

The chain emphasizes successive handlers; the async function makes each intermediate value a local variable. In production, decide whether the function should return the parsed data, check the HTTP response status where appropriate, and define how errors should be handled.

When should you choose each style?

Situation Promise chaining async/await Practical choice
Dependent steps Return a value or promise from each handler for the next handler. Use sequential await statements to show each dependency. Choose whichever makes the data flow easiest to see.
Independent operations Start operations before composing their promises, for example with Promise.all(). Start operations first, then await a combined result. Do not await independent work one operation at a time when it can safely proceed together.
Error handling Use a rejection handler in .then() or attach .catch(). Use try/catch around awaited operations. Handle errors near the operation if recovery is local; otherwise let them reach an intentional boundary.
Transformations and branching A short transformation pipeline can read directly as a chain. Local variables and branching can be clearer in an imperative workflow. Prefer the clearer form and stay consistent with the surrounding code.

Neither syntax is inherently faster or more concurrent. Runtime behavior follows promise settlement and handler scheduling; concurrency depends on when operations start and how their promises are composed.

How do you run independent promises concurrently?

Two separate await expressions run in sequence: the second operation does not start until execution reaches it. If the operations do not depend on one another, start both first and then await them together:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
const userPromise = getUser();
const settingsPromise = getSettings();
const [user, settings] = await Promise.all([userPromise, settingsPromise]);

Promise.all() rejects its aggregate when any input rejects. It does not cancel the other operations; they continue, but their individual outcomes are not returned through that rejected aggregate. Use Promise.allSettled() when you need every operation’s fulfilled or rejected outcome, even if some fail. The same composition methods work with promise chains: the syntax choice does not determine whether the work starts concurrently.

How does error handling differ?

In a chain, a rejection propagates to later rejection handlers until one handles it. .catch(handler) is shorthand for .then(undefined, handler). If the handler returns a value, the promise produced by .catch() fulfills with that value; if it throws or returns a rejected promise, the failure continues.

In an async function, rejection of an awaited promise is thrown at the await expression, where a surrounding try/catch can handle it:

async function loadData() {
  try {
    const response = await fetchData();
    return await response.json();
  } catch (error) {
    // Handle or rethrow the failure deliberately.
    throw error;
  }
}

Be deliberate about fallback values: returning one from a catch handler turns that failure path into a fulfilled promise. In either style, place recovery where you know what action is appropriate rather than swallowing errors accidentally.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Does await block JavaScript?

await pauses the rest of its surrounding async function until the awaited operation settles; it does not block the entire program. Other asynchronous work can continue. What matters for independent tasks is whether you start them before awaiting their combined result.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Which promise composition method should you use?

  • Promise.all() fulfills when all inputs fulfill and rejects if an input rejects; use it when all results are needed and any failure should fail the combined operation.
  • Promise.allSettled() waits for all inputs to settle and gives each outcome; use it when partial failures should not hide the rest.
  • Promise.any() and Promise.race() provide other composition behaviors when their settlement rules match the task.

These are promise-composition choices, not alternatives to async/await. You can await their results or use them in a chain.

Common misconceptions

  • “async/await is always faster.” The syntax alone does not establish a performance advantage.
  • “await makes JavaScript synchronous.” It pauses the surrounding async function, not the whole program.
  • “Promise.all() cancels the remaining requests when one fails.” It rejects the aggregate, but does not cancel the other operations.

For introductory explanations and reference details, see MDN’s guides to using promises, the Promise object, async functions, and the await operator.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Outdated Drivers Are Slowing You DownFree scan - exact matches
PC Slower Than It Used to Be?Free scan - under a minute

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.