Asynchronous JavaScript Cheat Sheet

JavaScript, Function, Promise · Jun 12, 2021

Promise basics

  • Promises start in a pending state, neither fulfilled or rejected.
  • When the operation is completed, a promise will become fulfilled with a value.
  • If the operation fails, a promise will get rejected with an error.

Creating promises

  • The function passed to the Promise constructor will execute synchronously.
  • Use resolve() or reject() to create promises from values.
  • Promise.resolve(val) will fulfill the promise with val.
  • Promise.reject(err) will reject the promise with err.
  • If you put a fulfilled promise into a fulfilled promise, they will collapse into one.
// Resolving with a value, rejecting with an error
new Promise((resolve, reject) => {
  performOperation((err, val) => {
    if (err) reject(err);
    else resolve(val);
  });
});

// Resolving without value, no need for reject
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));

Handling promises

promisedOperation()
  .then(
    val => value + 1,   // Called once the promise is fulfilled
    err => {            // Called if the promise is rejected
      if (err === someKnownErr) return defaultVal;
      else throw err;
    }
  )
  .catch(
    err => console.log(err); // Called if the promise is rejected
  )
  .finally(
    () => console.log('Done'); // Called once any outcome is available
  );
  • All three of the above methods will not be executed at least until the next tick, even for promises that already have an outcome.

Combining promises

  • Promise.all() turns an array of promises into a promise of an array.
  • If any promise is rejected, the error will pass through.
  • Promise.race() passes through the first settled promise.
Promise
  .all([ p1, p2, p3 ])
  .then(([ v1, v2, v3 ]) => {
    // Values always correspond to the order of promises,
    // not the order they resolved in (i.e. v1 corresponds to p1)
  });

Promise
  .race([ p1, p2, p3 ])
  .then(val => {
    // val will take the value of the first resolved promise
  });

async/await

  • Calling an async function always results in a promise.
  • (async () => value)() will resolve to value.
  • (async () => throw err)() will reject with an error.
  • await waits for a promise to be fulfilled and returns its value.
  • await can only be used in async functions.
  • await also accepts non-promise values.
  • await always waits at least until the next tick before resolving, even when waiting already fulfilled promises or non-promise values.
async () => {
  try {
    let val = await promisedValue();
    // Do stuff here
  } catch (err) {
    // Handle error
  }
}

Written by Angelos Chalaris

I'm Angelos Chalaris, a JavaScript software engineer, based in Athens, Greece. The best snippets from my coding adventures are published here to help others learn to code.

If you want to keep in touch, follow me on GitHub or Twitter.

More like this

  • Cheatsheets

    A collection of cheatsheets to bookmark and come back to whenever you need to look up anything.

    Collection · 15 snippets

  • Pipe async functions

    Performs left-to-right function composition for asynchronous functions.

    JavaScript, Function · Oct 22, 2020

  • Promisify function

    Converts an asynchronous function to return a promise.

    JavaScript, Function · Oct 22, 2020

  • Delay async function execution

    Delays the execution of an asynchronous function.

    JavaScript, Function · Oct 22, 2020